我有一个toCopy
HashMap
HashMap<String, Set<Integer>>
的形式。 toCopy
的关键字是由两个数字组成的字符串,例如&#34; 01&#34;或&#34; 10&#34;。
当我想在条目&#34; 01&#34;中添加一个值时,我做了
toCopy.get("01").add(1);
在这种情况下,出于某种原因,&#34; 01&#34;和&#34; 10&#34;条目&#39;价值已更新。有人能帮我弄清楚为什么会这样吗?
我也尝试过:
Set<Integer> a = toCopy.get("01")
a.add(1)
toCopy.put("01",a)
但结果是一样的。
我尝试使用调试器来查找正在进行的操作,但似乎hashmap只是同时更新了两个条目..
编辑:这是我的代码
Map<String,Set<Integer>> toCopy = new HashMap<>();
// initialize toCopy map
for(int d1 = 0; d1<dataCenters;d1++){
for(int d2 = 0; d2<dataCenters;d2++){
if(d1!=d2){
Set<Integer> value = new HashSet<>();
String key1 = Integer.toString(d1).concat(Integer.toString(d2));
String key2 = Integer.toString(d2).concat(Integer.toString(d1));
toCopy.put(key1,value);
toCopy.put(key2,value);
}
}
}
System.out.println(toCopy);
for(int i = 0; i < dataCenters; i++){
for(int j = 1; j < dataCenters-1; j++){
// data from two centers
Set<Integer> d1Data = data.get(i);
Set<Integer> d2Data = data.get(j);
// d1 => d2
// loop over data in d1, find those needed to be transferred
for(Integer d1: d1Data) {
String d1Tod2 = Integer.toString(i).concat(Integer.toString(j));
if(!d2Data.contains(d1)){
toCopy.get("01").add(d1);
}
}
答案 0 :(得分:6)
您为两个不同的键设置相同的值:
Set<Integer> value = new HashSet<>();
String key1 = Integer.toString(d1).concat(Integer.toString(d2));
String key2 = Integer.toString(d2).concat(Integer.toString(d1));
toCopy.put(key1,value);
toCopy.put(key2,value);
这就是改变其中一个改变的原因。
您需要为每个键创建一个不同的Set:
Set<Integer> value1 = new HashSet<>();
String key1 = Integer.toString(d1).concat(Integer.toString(d2));
toCopy.put(key1,value1);
Set<Integer> value2 = new HashSet<>();
String key2 = Integer.toString(d2).concat(Integer.toString(d1));
toCopy.put(key2,value2);