java - 合并两个具有重复键的 Map (Map<String, Map<String, Object>>)

标签 java hashmap guava multimap

我有两个来自 Guava 的 ImmutableMap,我试图将它们组合在一起,它们可以有重复的键;

Map<String, Map<String, Object>> map1 = new ImmutableMap.Builder<String, Map<String, Object>>()
        .put("config", ImmutableMap.of(
                "key1", "value1",
                "key2", "value2"))
        .put("categoryapproval", ImmutableMap.of("reason_code", "listing_quality"))
        .build();

Map<String, Map<String, Object>> map2 = new ImmutableMap.Builder<String, Map<String, Object>>()
        .put("config", ImmutableMap.of(
                "key1", "value3",
                "key4", "value4"))
        .build();

因此,我无法使用 putAll() 方法,因为它会抛出 DuplicateKeyException ,这是预期的。我想要得到的输出是这样的;

"config" --> "key1": {value1, value3},
             "key2": {value2},
             "key4": {value4}

最后,我还尝试了 MultiValueMap,但是,MultiValueMap 将值保留为我需要迭代的 List 。在 map1 中,我可以通过 map1.get("config").get("key1") 获取 value1,其中 value1 可以是任何类型目的。我感谢任何形式的帮助。

最佳答案

您可以使用Guava的Multimap和 Java 8 的 Map.merge(K, V, BiFunction) :

Map<String, Multimap<String, Object>> merged = new HashMap<>();
BiFunction<Multimap<String, Object>, Multimap<String, Object>, Multimap<String, Object>> remappingFunction = (value1, value2) -> {
    Multimap<String, Object> multimap = HashMultimap.<String, Object>create();
    multimap.putAll(value1);
    multimap.putAll(value2);
    return multimap;
};
map1.forEach((key, value) -> merged.merge(key, Multimaps.forMap(value), remappingFunction));
map2.forEach((key, value) -> merged.merge(key, Multimaps.forMap(value), remappingFunction));
merged.get("config").get("key1");

如果您不使用 Java 8,那么您需要以其他方式管理多重映射的合并,但想法是相同的。

关于java - 合并两个具有重复键的 Map (Map<String, Map<String, Object>>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35377810/

相关文章:

java - 为什么 HashMap 不保证 map 的顺序会随着时间的推移保持不变

c++ - 键为 2 的幂的快速映射 (C++)

java - 使用自定义表模型从 JTable 中删除行

java - 新版本的 osgified Guava 库

java - ImmutableList.builder() 错误?

java - 从 HTML Web 应用程序访问 Java 类

java - 用 Java 签署 AWS S3 链接(包括版本控制)

java - 提取 ArrayList<String> 的元素作为 Hashmap 的一部分

Android X + Truth + Guava 测试编译问题

java - Gson、枚举和尝试在空对象引用上调用虚拟方法 'java.lang.Class java.lang.Object.getClass()'