【问题标题】:Java Map Iteration Using Map Inside Map and storing it in another Map after IterationJava Map 迭代使用 Map Inside Map 并在迭代后将其存储在另一个 Map 中
【发布时间】:2012-07-20 10:14:47
【问题描述】:

我使用从数据库中获取了一些数据并将其存储在如下列表中:

List<MyObject> list =new ArrayList<MyObject>();

列表包含 2 个 MyObject 类的对象。

我有 2 个地图实现:

Map<String,Map<String,Long>> map1 = new HashMap<String,Map<String,Long>>();
Map<String,Long> map2 = new HashMap<String,Long>();

我迭代了列表并做了以下代码

for(myObjectObj   :   list){

      map2.put(myObjectObj.getAction(),myObjectObj.getCount());
      map1.put(myObjectObj.getName(),map2);
}

我想要的最终输出是以下方式的 map1:

Name1 action1 count1
      action2 count2
Name2 action3 count3
      action4 count4

但是我的代码没有得到想要的输出。

【问题讨论】:

  • 指定你正在得到什么输出将是一个好的开始。

标签: java arrays list map


【解决方案1】:

在您当前的版本中,您添加到 map2 实例的数据实际上将添加到 map1 的所有条目中,因为 map2 引用对所有 map1 实例都是通用的。

鉴于您希望列表中的每个条目都有一个新的嵌套映射,您需要在循环中获取或实例化一个新的 map2:

for(myObjectObj   :   list){ 
      String key = myObjectObj.getName();
      Map<String,Long> map2 = map1.get(key);
      if (map2 == null) {
          map2 = new HashMap<String,Long>();
          map1.put(key, map2);
      }
      map2.put(myObjectObj.getAction(),myObjectObj.getCount());
}

【讨论】:

  • 实际上,您需要先测试一下map1 中是否已经存在该密钥,如果存在,请将新条目添加到该映射中-您的版本不会这样做..
  • @Nim 鉴于数据来自数据库,我假设 map1 键是对象的 pk,因此不需要检查。无论如何,我认为这个答案解决了 OP 的主要问题; cfr:使用共享的嵌套地图实例。基于 OP 要求的其他条件由他/她负责。
  • @Nim 哦,我明白了。你是对的。有必要抬头看看。或者谷歌多地图,让事情变得更容易。
  • @Nim,感谢您的观察。现在应该更正了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2017-03-03
相关资源
最近更新 更多