【问题标题】:About Java HashMap: when key is a Set<Integer>关于 Java HashMap:当 key 是 Set<Integer>
【发布时间】:2014-09-27 05:42:43
【问题描述】:

我有一个toCopyHashMap,其格式为HashMap&lt;String, Set&lt;Integer&gt;&gt;toCopy的key是一个由两个数字组成的字符串,比如“01”或者“10”。

当我想为条目“01”添加一个值时,我做到了

toCopy.get("01").add(1);

在这种情况下,出于某种原因,“01”和“10”条目的值都已更新。谁能帮我弄清楚为什么会这样?

我也试过这样做:

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

【问题讨论】:

  • 请提供一个完整的工作示例来演示此行为。

标签: java hashmap set


【解决方案1】:

您正在为两个不同的键设置相同的值:

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

【讨论】:

  • 非常感谢!没听懂!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 2016-07-07
  • 2021-10-01
  • 2020-11-30
  • 2012-05-26
  • 1970-01-01
相关资源
最近更新 更多