2013-02-03 100 views
1

我在for循環中使用HashMap時遇到問題。我做錯了什麼?我有什麼改變嗎?以下是代碼及其輸出。Java HashMap「put」方法在for循環中

代碼:

public static void main(String[] args) { 

    ArrayList<Double> arrBuckets = new ArrayList<Double>(3); 

    HashMap<Integer, ArrayList<Double>> hashMap = new HashMap<Integer, ArrayList<Double>>(); 

    for(int i=1;i<5;i++) 
    { 
     arrBuckets.clear(); 
     arrBuckets.add(0,(1.0*i)) ; 
     arrBuckets.add(1,(2.0*i)) ; 
     arrBuckets.add(2,(3.0*i)) ; 

     hashMap.put(i, arrBuckets); 
    } 

    System.out.println("hashMap : "+hashMap); 
} 

下面是輸出:

hashMap : {1=[4.0, 8.0, 12.0], 2=[4.0, 8.0, 12.0], 3=[4.0, 8.0, 12.0], 4=[4.0, 8.0, 12.0]} 

但輸出應該是這樣:

hashMap : {1=[1.0, 2.0, 3.0], 2=[2.0, 4.0, 6.0], 3=[3.0, 6.0, 9.0], 4=[4.0, 8.0, 12.0]} 

回答

2

這是因爲你總是使用相同的arrayList:最後只有一個ArrayList實例,它保存最後一次迭代的值。

當您將集合的對象在另一個集合你傳遞一個參考的對象,而不是對象本身的副本,你的循環改爲

for(int i=1;i<5;i++) 
{ 
    ArrayList<Double> arrBuckets = new ArrayList<Double>(3); 
    arrBuckets.add(0,(1.0*i)) ; 
    arrBuckets.add(1,(2.0*i)) ; 
    arrBuckets.add(2,(3.0*i)) ; 

    hashMap.put(i, arrBuckets); 
} 
+0

我會提出聲明的循環內爲好。 –

+0

它的定義,應該移動... – Mordechai

+0

它運作良好..感謝彼得勞瑞和dystroy快速回應。 – ss03

5

。您只創建一個列表,並且您將添加該列表四次。

我建議你在循環內移動新的ArrayList,而不是每次重新使用列表。

你可以寫

Map<Integer, List<Double>> map = new HashMap<Integer, List<Double>>(); 
for (int i = 1; i < 5; i++) 
    map.put(i, Arrays.asList(1.0 * i, 2.0 * i, 3.0 * i)); 
System.out.println("map : " + map); 

打印

map : {1=[1.0, 2.0, 3.0], 2=[2.0, 4.0, 6.0], 3=[3.0, 6.0, 9.0], 4=[4.0, 8.0, 12.0]}