我有一个externalMap,其中包含它获得的每个键的innerMap。最初,每个innerMap都是相同的(此处,它们包含{1 = 1}。
我想为某个键更改一个特定内图的值。

这是我的代码:

public class HelloWorld
{
  public static void main(String args[]){

        HashMap<String, HashMap<String, Integer>> outerMap = new HashMap<String, HashMap<String, Integer>>();
        HashMap<String, Integer> innerMap = new HashMap<String, Integer>();

        outerMap.put("1001",innerMap);
        outerMap.put("1002",innerMap);
        outerMap.put("1003",innerMap);

            innerMap.put("1", 1);

 //My attempt to change only one innermap;

            Map<String, Integer> map_to_change = outerMap.get("1001");
            map_to_change.put("1", 0);

//And then I print them to see if it's working;

            for(Map.Entry map  :  outerMap.entrySet() )

        {
            System.out.println(map.getKey()+" "+map.getValue());

        }
    }
}


但是,这里的输出是

1003 {1=0}
1002 {1=0}
1001 {1=0}


这表明我的代码更改了所有内部映射,不仅更改了与键“ 1001”链接的内部映射。
我能做什么?

最佳答案

您在innerMap中指向相同的outerMap对象,

outerMap.put("1001",new HashMap<String, Integer>());//create separate maps
outerMap.put("1002",new HashMap<String, Integer>());
outerMap.put("1003",new HashMap<String, Integer>());

HashMap<String, Integer> innerMap =outerMap.get("1001");//get the map you want to put value
innerMap.put("1", 1);//assign the value


更新:
如果要保留已经创建的Map副本,则可以使用Map方法从中复制并创建新的putAll

outerMap.put("1001",copyMap(innerMap));
outerMap.put("1002",copyMap(innerMap));
outerMap.put("1003",copyMap(innerMap));


copyMap方法看起来像,

private static HashMap<String, Integer> copyMap(HashMap<String, Integer> innerMap){
    HashMap<String, Integer> copiedInnerMap = new HashMap<String, Integer>();
    copiedInnerMap.putAll(innerMap);
    return copiedInnerMap;
}

关于java - 在Java中更新包含哈希表的哈希表的某个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52081127/

10-10 23:47