嵌套哈希映射问题(Java)

嵌套哈希映射问题(Java),java,multidimensional-array,hashmap,Java,Multidimensional Array,Hashmap,我有一个问题,我试图通过将其中一个嵌套在另一个中来创建2D HashMap,但我有一个奇怪的问题,其中一些数据被更多的数据覆盖,我不确定如何修复它。非常感谢您提前花了这么多时间和精力 import java.util.HashMap; public static void main(String args[]) { HashMap<Integer, HashMap<Integer, Integer>> outerMap = new HashMap<In

我有一个问题,我试图通过将其中一个嵌套在另一个中来创建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));

}
import java.util.HashMap;
公共静态void main(字符串参数[]){
HashMap outerMap=新HashMap();
HashMap innnerMap=新的HashMap();
整数;
innnerMap.put(5100);
外部地图放置(6,内部地图);
innnerMap.put(5,77);
外部地图放置(10,InnerMap);
innnerMap.put(33,88);
外部地图放置(6,内部地图);
System.out.println(outerMap.get(6.get(5));
}
}

这段代码给出的输出是77,尽管很明显100是预期的输出。我仍然认为黑魔法是罪魁祸首:/

编辑: 我的帖子与我被标记为复制对象的帖子完全不同,我的帖子是关于嵌套哈希映射的,还有关于列表和静态字段的


这篇文章已经被回复了,但不是重复的

如果将同一个内部HashMap多次添加到外部HashMap,您将看到“数据被更多数据覆盖”

在将内部HashMap添加到外部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));

使用同一个键放置两个值

innnerMap.put(5, 100);
innnerMap.put(5, 77);
这就是它覆盖该值的原因。如果每次都在InnerMap中创建新的
实例,则问题将得到解决

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

将相同的键分配给外部映射和内部映射,值被重写。如果密钥存在,它将检查哈希代码。如果哈希代码等于,则哈希映射将在密钥之间执行等于。如果它们相等,则将使用新的键值对重写键。通常,当您将innermap声明为退出while循环时,会发生这种情况。
请确保每次都为innermap创建新实例。

True但这会将null作为输出,这是因为新的innermap会破坏旧的实例吗?“我该如何防止这种情况发生呢?”山姆我正在编辑我的答案,这时有人编辑了我的答案,使我的更改消失了。这很烦人。感谢您安装了awenser并保留了用户1121883的awenser。对于那些在这个问题上犹豫不决的人,就像简明的
ComputeFabSent(6,HashMap::new)一样,这里有一个警告样式:这并不完全符合人们的期望-它可以工作,只是因为
HashMap
有一个接受
int
的构造函数,并且调用了这个构造函数:。它不适用于其他类型的键。因此,使用
k->newhashmap()
作为映射函数更为正确。
innnerMap = new HashMap<Integer, Integer>();
innnerMap.put(5, 100);