我有一个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时会发生这种情况?关于如何完成我需要的任何想法?
答案 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));