我有这个问题,我试图通过将其中一个嵌套在另一个内部来创建一个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,而且是关于列表和静态字段。
此帖已经回答,但不是重复!
答案 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 循环中声明你的内部映射时发生。 确保每次都为内映射创建新实例。