嵌套的Hashmap问题(Java)

时间:2016-09-01 11:35:48

标签: java multidimensional-array hashmap

我有这个问题,我试图通过将其中一个嵌套在另一个内部来创建一个2D HashMap但我有这个奇怪的问题,其中一些数据被更多数据覆盖,我不确定如何解决它。非常感谢您提前花费的所有时间和精力。

import java.util.HashMap;


public static void main(String args[]) {

    HashMap<Integer, HashMap<Integer, Integer>> outerMap = new HashMap<Integer, HashMap<Integer, Integer>>();
    HashMap<Integer, Integer> innnerMap = new HashMap<Integer, Integer>();
    int number;

    innnerMap.put(5, 100);
    outerMap.put(6, innnerMap);

    innnerMap.put(5, 77);
    outerMap.put(10, innnerMap);

    innnerMap.put(33, 88);
    outerMap.put(6, innnerMap);

    System.out.println(outerMap.get(6).get(5));

}

}

此代码给出的输出为77,尽管很明显100是预期输出。我仍然说黑暗魔法应该归咎于:/

编辑: 我的帖子与我标记为重复的帖子完全不同,我的帖子是关于嵌套的HashMaps,而且是关于列表和静态字段。

此帖已经回答,但不是重复!

4 个答案:

答案 0 :(得分:4)

如果多次将相同的内部HashMap添加到外部HashMap,您将看到&#34;数据被更多数据覆盖&#34;。

在将其添加到外部HashMap之前,您必须先创建一个新的内部HashMap:

如果要将数据添加到内部地图,则必须检查是否已将其添加到外部地图中,如果必须,则必须使用现有的内部地图。

Java 8有一个简短而实用的方法:

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

innerMap = outerMap.computeIfAbsent(6, HashMap::new); // this will put a new inner HashMap 
                                                      // in the outer HashMap if it
                                                      // doesn't contain a value for the
                                                      // given key 6, or return the
                                                      // existing inner map otherwise
innerMap.put(5, 100);

innerMap = outerMap.computeIfAbsent(10, HashMap::new);
innerMap.put(5, 77);

innerMap = outerMap.computeIfAbsent(6, HashMap::new);
innerMap.put(33, 88);

System.out.println(outerMap.get(6).get(5));

此代码由user1121883添加。如果您不能使用Java 8,则可以使用它:

public static HashMap<Integer,Integer> get(Integer key, HashMap<Integer, HashMap<Integer, Integer>> map){
    HashMap<Integer,Integer> innerMap = map.get(key);
    if(innerMap == null){
        innerMap = new HashMap<>();
        map.put(key, innerMap);
    }
    return innerMap;
}

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

    HashMap<Integer, Integer> innnerMap = get(6, outerMap);
    innnerMap.put(5, 100);

    innnerMap = get(10, outerMap);
    innnerMap.put(5, 77);

    innnerMap = get(6, outerMap);
    innnerMap.put(33, 88);

    System.out.println(outerMap.get(6).get(5));

答案 1 :(得分:2)

您使用相同的键放置两个值

innnerMap.put(5, 100);
innnerMap.put(5, 77);

这就是它覆盖价值的原因。如果每次问题解决时都创建innnerMap的新实例

innnerMap = new HashMap<Integer, Integer>();
innnerMap.put(5, 100);

答案 2 :(得分:1)

您将相同的键分配给外部地图和内部地图,这些值被重写。如果密钥存在,则检查哈希码是否哈希码等于哈希码,哈希映射在密钥之间执行等于。如果它们相等,则将使用新的键值对重写密钥

答案 3 :(得分:0)

通常这会在你从 while 循环中声明你的内部映射时发生。 确保每次都为内映射创建新实例。