2

HashMapforループで使用しているときに問題が発生します。私は何か間違ったことをしていますか?変更が必要ですか?以下はコードとその出力です。

コード:

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]}
4

2 に答える 2

5

コレクションのオブジェクトを別のコレクションに配置すると、オブジェクト自体のコピーではなく、オブジェクトへの参照が渡されます。リストを 1 つだけ作成し、このリストを 4 回追加しています。

毎回リストを再利用するのではなく、新しい 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]}
于 2013-02-03T09:41:38.357 に答える
3

これは、常に同じ arrayList を使用するためです。最後に のインスタンスが 1 つしかなく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);
}
于 2013-02-03T09:41:34.653 に答える