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