【问题标题】:Loop by Object inside another Object in Java在Java中的另一个对象内按对象循环
【发布时间】:2015-06-15 15:56:50
【问题描述】:

我不知道如何用文字问这个问题,所以这里有一个例子:

建筑类有这样的数据:

Map<Season, List<Info>> infosBySeason = new TreeMap<Season, List<Info>>();

我想做的是循环每个建筑物,按季节信息打印。

喜欢:

Season 1 :
  Building 1 :
    Info 1, Info 2....
  Building 2 :
    Info 1, Info 2....

Season 2 :
  Building 1 :
    Info 1, Info 2....
  Building 2 :
    Info 1, Info 2....

我是否应该将 Season 作为外部类并为每个 Season 复制 Building?

有没有很好的方法来处理类之间的这种“多对多”关系?

【问题讨论】:

  • 建筑是根据列表中的位置推断出来的吗?
  • 回答你的问题:在某种程度上,集合比数据库低级;您本身并没有获得索引,因此您可以根据您将如何查找数据来构建数据。重复问题也存在于关系数据库中(这就是索引的工作方式),只是现在您自己管理它们。基本上,如果您通过Seasion Building 查找,您将获得一些超出集合擅长的东西。
  • @DavidEhrmann 不确定您的第一个问题是什么意思。除了使用 Collections 之外,是否有一个通用的策略来处理这个问题?
  • “有点超出内置 Collections擅长的东西。”如果您不反对使用外部集合库,则可以查看MultiKeyMapApache Collections' 实现。听起来你有点像新手,所以也许这不适合你,但仍然值得一提,IMO。

标签: java list oop collections


【解决方案1】:

这将解决问题,seasonMap 按您需要的顺序包含值(假设类实现 Comparable)

Map<Season, Map<Building, List<Info>>> seasonMap = new TreeMap<>();
for (Building building : buildings) {
    for (Map.Entry<Season, List<Info>> e : building.infosBySeason.entrySet()) {
        Season season = e.getKey();
        List<Info> infos = e.getValue();
        if (!seasonMap.containsKey(season)) {
            seasonMap.put(season, new TreeMap<>());
        }

        seasonMap.get(season).put(building, infos);
    }
}

我是否应该将 Season 作为外部类并复制 Building for 每个季节?

坏主意,您很可能会陷入难以维护的循环依赖关系。

有没有很好的方法来处理这种“多对多” 类之间的关系?

设计更好的数据模型是简化代码的一种方式。你可以说数据模型很好,如果它有效地解决了你的所有需求。如果您将使用您描述的 99% 时间的循环,那么最好将 Building 设为 Season 类的成员并反转逻辑。

【讨论】:

    【解决方案2】:

    这可能是另一个想法,假设您创建类

    class Season implements Comparable<Season>
    //....
    class Building implements Comparable<Building> 
    //.....
    class Info
    //....
    
    Map<Season, Map<Building, List<Info>>> seasonMap = new TreeMap<>();
    //initialize and put your values inside seasonMap 
    //....
    
    for(Season s: seasonMap.keySet()){
        System.out.println(s.toString()+":");
        Map<Building, List<Info>> map = seasonMap.get(s);
        for(Building b: map.keySet()){
            System.out.println("\t"+b.toString() + ":");
            List<Info> list = map.get(b);
            System.out.print("\t\t");
            for(Info info: list){
                System.out.print(info.toString() + ",");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 2019-05-18
      • 2021-07-25
      • 2017-02-26
      • 2019-03-14
      • 1970-01-01
      相关资源
      最近更新 更多