List.set替换TreeMap中的所有索引

时间:2017-12-05 16:04:38

标签: java dictionary treemap

我有一个TreeMap<String, List<Double>我想在某个键上拉出List,在某个索引处添加一个值,然后将它放回到TreeMap中。

在下面的代码中,TreeMap包含:

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

我想在索引0处将值添加到specificKey,因此{specificKey=[777,0,0], specificKey2=[0,0,0], specificKey3=[0,0,0]}

以下是有问题的代码......

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)提取确切的List时会发生这种情况?关于如何完成我需要的任何想法?

2 个答案:

答案 0 :(得分:3)

你正在做的一切正确。此外,您可以删除myMap.put(specificKey, doubleList),因为列表已经存在。

在您的方案中出现这种情况的原因是,所有三个键都引用了您在填充List<Double>时创建的TreeMap的同一个实例。更改代码以插入每个键的新列表以解决此问题:

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);
}

答案 1 :(得分:2)

您已使用同一列表对象的三个实例填充了地图。您需要创建三个不同的列表。例如:

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));