2012-07-20 97 views
0

它在另一个地图存储使用我获取一些数据从数据库并将其存储在如下列表:的Java地图迭代使用地图中地图后迭代

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

列表包含2 myObject的类的对象。

我有2个Map实现:

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 

但用我的代码我没有得到所需的输出。

+0

指定输出什么,你*的*越来越将是一个很好开始。 – Thor84no 2012-07-20 10:19:16

回答

2

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

既然你要为列表中的所有条目的新嵌套的地图,你需要获得或循环中实例化一个新的微管相关蛋白:

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()); 
} 
+0

实际上你需要测试一下,看看密钥是否已经存在于'map1'中,如果它已经存在,则将新条目添加到该地图 - 你的版本不会那样做。 – Nim 2012-07-20 10:22:05

+0

@Nim假设数据是来自数据库,我假设map1键是对象的pk,因此检查不应该是必要的。无论如何,我认为这个答案解决了OP的主要问题; cfr:使用共享的嵌套地图实例。基于OP的要求的其他条件是他/她的责任。 – maasg 2012-07-20 10:27:15

+0

从期望的输出,你对pk的假设显然是不正确的... – Nim 2012-07-20 10:29:31