2012-07-20 146 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