如何将2个HashMap合并在一起?

时间:2019-05-02 21:10:06

标签: java hashmap

我有2个HashMap<String, Integer>类型的HashMap。我想将它们加在一起,使得重复键的值被加在一起,而不是被覆盖。这就是为什么我不能对HashMaps使用putAll方法的主要原因。有什么特别的方法可以让我轻松地做到这一点吗?

4 个答案:

答案 0 :(得分:5)

例如,您可以使用Map#merge

 Map<String, Integer> map1 = new HashMap<>();
 Map<String, Integer> map2 = new HashMap<>();

 map1.put("a", 1);
 map2.put("a", 2);

 Map<String, Integer> map3 = new HashMap<>(map1);
 map2.forEach((key, value) -> map3.merge(key, value, (v1,v2) -> v1+v2));
 System.out.println(map3); // a=3

答案 1 :(得分:2)

您可以仅使用Stream.concat()来连接两个地图的流。然后,您可以收集它们并将重复项相加:

Map<String, Integer> map1 = new HashMap<>();
map1.put("a", 2);
map1.put("b", 3);
Map<String, Integer> map2 = new HashMap<>();
map2.put("b", 1);
map2.put("c", 3);

Map<String, Integer> merged = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a + b));

您也可以使用(a, b) -> a + b代替Integer::sum

其结果将是:

{a=2, b=4, c=3}

答案 2 :(得分:1)

您可以在Java 8中使用map merge

public static void main(String[] args) {
       Map<String, Integer> map1 = new HashMap<>();
       map1.put("1", 1);
       map1.put("2", 2);

        Map<String, Integer> map2 = new HashMap<>();
        map2.put("2", 2);
        map2.put("3", 3);

        map1.forEach((key, value) -> map2.merge(key, value, Integer::sum));

        map2.forEach((s, integer) -> System.out.println(s + " " + integer));
    }

输出为:

1 1
2 4
3 3

答案 3 :(得分:0)

在制作简单的单线纸时,Stream API是您的朋友。我将使用Stream#collect方法和Collectors#toMap方法。例如:

Map<String, Integer> map1 = new HashMap<String, Integer>() {
    {
        put("first", 1);
        put("second", 4);
        put("third", 7);
    }
};
Map<String, Integer> map2 = new HashMap<String, Integer>() {
    {
        put("fourth", 5);
        put("fifth", 9);
        put("third", 3);
    }
};
Map<String, Integer> result = Stream.of(map1, map2).map(Map::entrySet).flatMap(Collection::stream)
        .collect(Collectors.<Entry<String, Integer>, String, Integer>toMap(Entry::getKey, Entry::getValue,
                (t, u) -> t + u));