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));
我有一个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));