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

List.set replacing all indexes inside TreeMap

我有一个TreeMap<String, List<Double>,我想在某个键处拉出列表,在某个索引处添加一个值,然后将其放回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) 提取确切的列表时,为什么会发生这种情况?以及关于如何完成我需要的任何想法?

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

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

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

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

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