2013-05-13 20 views
1
 HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>(); 
    ArrayList<Integer> al = new ArrayList<Integer>();//arraylist as value 

    for (int j = 0; j < 3; j++) { 
     for (int i = 0; i < 5; i++) { 
      al.add(i + j); 
     } 
     System.out.println(al); 
     System.out.println(j);//key value 
     map.put(j, al); 
     System.out.println(map); 
     al.clear(); 
    } 

爲什麼最後的值arraylist會覆蓋所有鍵上?如何避免過度寫作?使用put來存儲新的鍵值對時,現有鍵的HashMap值將被覆蓋。如何預防它?

回答

6

您需要移動這條線:

ArrayList<Integer> al = new ArrayList<Integer>();//arraylist as value 

內循環。

您想要爲每個對象創建ArrayList,而不是僅爲所有對象創建一個。

for (int j = 0; j < 3; j++) { 
    ArrayList<Integer> al = new ArrayList<Integer>(); 
    for (int i = 0; i < 5; i++) { 
     al.add(i + j); 
    } 
    System.out.println(al); 
    System.out.println(j);//key value 
    map.put(j, al); 
    System.out.println(map); 
} 
+0

al.clear()不起作用? – cooltoad 2013-05-13 12:56:10

+3

不。它清除數組,但是您一遍又一遍地使用相同的數組。使用「put」可以保存數組列表引用,而不是副本,因此在放置數組後實際更改地圖值時更改數組列表。 – BobTheBuilder 2013-05-13 12:57:18

+0

哦好!感謝您解決疑問..現在我的代碼工作正常。 – cooltoad 2013-05-13 13:07:48

0

您不能只是清除它重用舊ArrayList,你需要創建一個新的每次:

for (int j = 0; j < 3; j++) { 
    ArrayList<Integer> al = new ArrayList<Integer>(); 
    for (int i = 0; i < 5; i++) { 
     al.add(i + j); 
    } 
    System.out.println(al); 
    System.out.println(j);//key value 
    map.put(j, al); 
    System.out.println(map); 
} 

的原因是HashMap將指向所有條目相同的ArrayList將被覆蓋每次運行。

+0

耶現在得到它。謝謝 – cooltoad 2013-05-13 13:08:26