关于Java HashMap:当key是Set <integer> </integer>时

时间:2014-09-27 05:42:43

标签: java hashmap set

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

1 个答案:

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