嵌套哈希映射问题(Java)
我有一个问题,我试图通过将其中一个嵌套在另一个中来创建2D HashMap,但我有一个奇怪的问题,其中一些数据被更多的数据覆盖,我不确定如何修复它。非常感谢您提前花了这么多时间和精力嵌套哈希映射问题(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
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);