2017-12-05 5 views
1

私持っている私は、特定のキーでリストを引き出す特定のインデックスに値を追加し、その後にそれを戻したいTreeMap<String, List<Double> TreeMap以下のコードの時List.set

、TreeMapのは含まれています

{specificKey=[0,0,0], specificKey2=[0,0,0], specificKey3=[0,0,0]}

を私はそう{specificKey=[777,0,0], specificKey2=[0,0,0], specificKey3=[0,0,0]}

、インデックス0でspecificKeyに値を追加したいここで問題のコードは..です。

if (myMap.containsKey(specificKey){ 
    List<Double> doubleList = myMap.get(specificKey); 
    doubleList.set(0, someValue); 
    myMap.put(specificKey, doubleList); 
} 

代わりに、何が起こるかは次のとおりです。{specificKey=[777,0,0], specificKey2=[777,0,0], specificKey3=[777,0,0]}

myMap.get(specificKey)を使用して正確なリストを取り出すときに、なぜこのようなことが起こりますか?そして、私が必要とするものを達成する方法に関するアイデア?

答えて

3

あなたはすべて正しいことをしています。また、既にリストがあるので、myMap.put(specificKey, doubleList)を削除することができます。

シナリオでこれが発生する理由は、TreeMapを入力するときに作成したList<Double>の同じインスタンスを3つのキーすべてで参照するためです。

myMap.put(specificKey1, new ArrayList<Double>(Collections.nCopies(3, Double.valueOf(0)))); 
myMap.put(specificKey2, new ArrayList<Double>(Collections.nCopies(3, Double.valueOf(0)))); 
myMap.put(specificKey3, new ArrayList<Double>(Collections.nCopies(3, Double.valueOf(0)))); 
... 
if (myMap.containsKey(specificKey1){ 
    myMap.get(specificKey1).set(0, someValue); 
} 
2

同じリストオブジェクトの3つのインスタンスでマップを作成しました。 3つの異なるリストを作成する必要があります。例:

TreeMap<String, List<Double>> myMap = new TreeMap<>(); 
myMap.put(specificKey, Arrays.asList(0.0, 0.0, 0.0)); 
myMap.put(specificKey2, Arrays.asList(0.0, 0.0, 0.0)); 
myMap.put(specificKey3, Arrays.asList(0.0, 0.0, 0.0)); 
関連する問題