java - 在Java中合并两个Maps的Maps

标签 java merge hashmap

我有一个 HashMap,其中又包含一个 HashMap,

Map<Long, Map<String, Double>> map = new HashMap<>();

对于同一个 Long 值,我将有多个内部映射,如何确保值字段不被替换而是合并(附加)?

此问题与 How to putAll on Java hashMap contents of one to another, but not replace existing keys and values? 不同因为它是关于字符串的映射,所以我被映射的映射所困扰

例如

Map<Long, Map<String, Double>> map = new HashMap<>();
Map<String, Double> map1 = new HashMap<>();
Map<String, Double> map2 = new HashMap<>();

map1.put("1key1", 1.0);
map1.put("1key2", 2.0);
map1.put("1key3", 3.0);

map2.put("2key1", 4.0);
map2.put("2key2", 5.0);
map2.put("2key3", 6.0);

map.put(222l, map1);
map.put(222l, map2);

应该为我提供 6 个键 '222' 的内部映射条目,而不是 3 个。

最佳答案

如果您使用的是 Java 8,您可以调用 merge 而不是 put方法:

map.merge(222L, map2, (m1, m2) -> {m1.putAll(m2);return m1;});

如果映射已经具有与给定键对应的值,则将调用作为第三个参数传递的合并函数,该函数仅将新映射的内容添加到先前存在的映射中。完整代码如下:

Map<Long, Map<String, Double>> map = new HashMap<>();
Map<String, Double> map1 = new HashMap<>();
Map<String, Double> map2 = new HashMap<>();

map1.put("1key1", 1.0);
map1.put("1key2", 2.0);
map1.put("1key3", 3.0);

map2.put("2key1", 4.0);
map2.put("2key2", 5.0);
map2.put("2key3", 6.0);

map.merge(222L, map1, (m1, m2) -> {m1.putAll(m2);return m1;});
map.merge(222L, map2, (m1, m2) -> {m1.putAll(m2);return m1;});
System.out.println(map);

打印所有六个键:

{222={1key2=2.0, 1key3=3.0, 2key3=6.0, 2key1=4.0, 1key1=1.0, 2key2=5.0}}

关于java - 在Java中合并两个Maps的Maps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42240350/

相关文章:

java - 在为 HashMap 分配值时使用(对象)

java - 使用 hashmap 和同步方法调用的简单缓存机制

java - 使用两个 HashMap 是否会使算法成为 O(n 平方)?

ios - xcode 在分支 merge 后用空格替换制表符

用于外部排序的 C# N 方式合并

android - 如何在将 ArrayList 添加到 Android 中的 HashMap 后清除 ArrayList?

java - Java Xmx 和 Docker 容器 RAM 大小之间还有多少余量?

java - 从纳秒级获取人类可读时间

java - UBUNTU - java 编译但未执行 - log4j ClassNotFoundException

MERGE 与来自单个节点的 3+ 关系