如何轻松地求和两个 hashMap<String,Integer>?
how to easily sum two hashMap<String,Integer>?
我有两个HashMap<String,Integer>
如何简单地总结它们?
意味着对于字符串 "a",键将是(来自 Map1 的值 + 来自 Map2 的值)的总和?
我可以迭代 Map2 的每一项并手动添加到 Map1。
但认为可能有更简单的方法?
我更喜欢将整数求和到其中一张地图中。不创建新的
不幸的是,没有简单的方法。您需要手动迭代它们。
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class HashMapSum {
public static void main(String[] args) {
Map<String, Integer> map1 = new HashMap<String, Integer>();
map1.put("a", 1);
map1.put("b", 2);
map1.put("c", 3);
Map<String, Integer> map2 = new HashMap<String, Integer>();
map2.put("a", 4);
map2.put("b", 5);
map2.put("d", 6);
Set<String> keySet = new HashSet<String>();
keySet.addAll(map1.keySet());
keySet.addAll(map2.keySet());
Map<String, Integer> map3 = new HashMap<String, Integer>();
Integer val1, val2;
for (String key : keySet) {
val1 = map1.get(key);
val1 = (val1 == null ? 0 : val1);
val2 = map2.get(key);
val2 = (val2 == null ? 0 : val2);
map3.put(key, val1 + val2);
}
System.out.println(map3.toString());
}
}
因为 Java 8 Map
包含 merge
需要
的方法
- 键,
- 新值,
- 和将用于决定将什么值放入地图的函数如果它已经包含我们的键(将根据旧值和新值做出决定)。
所以你可以简单地使用:
map2.forEach((k, v) -> map1.merge(k, v, Integer::sum));
现在您的 map1
将包含来自 map2
的所有值,如果键相同,旧值将添加到新值,结果将存储在映射中。
演示:
Map<String, Integer> m1 = new HashMap<>();
m1.put("a", 1);
m1.put("b", 2);
Map<String, Integer> m2 = new HashMap<>();
m2.put("a", 3);
m2.put("c", 10);
System.out.println(m1);
System.out.println(m2);
//iterate over second map and merge its elements into map 1 using
//same key and sum of values
m2.forEach((k, v) -> m1.merge(k, v, Integer::sum));
System.out.println("===========");
System.out.println(m1);
输出:
{a=1, b=2}
{a=3, c=10}
===========
{a=4, b=2, c=10}
如果你喜欢 Java 8:
Map<String, Integer> sum(Map<String, Integer>... maps) {
return Stream.of(maps) // Stream<Map<..>>
.map(Map::entrySet) // Stream<Set<Map.Entry<..>>
.flatMap(Collection::stream) // Stream<Map.Entry<..>>
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
Integer::sum));
}
可以总结任意数量的地图。它在前几行中将地图数组转换为 Stream<Map.Entry<String, Integer>
,然后将所有条目收集到新的 Map
中,同时在出现重复值时提供 "merge function"。
或者类似于
void addToA(HashMap<String, Integer> a, HashMap<String, Integer> b) {
for (Entry<String, Integer> entry : b.entrySet()) {
Integer old = a.get(entry.getKey());
Integer val = entry.getValue();
a.put(entry.getKey(), old != null ? old + val : val);
}
}
我有两个HashMap<String,Integer>
如何简单地总结它们?
意味着对于字符串 "a",键将是(来自 Map1 的值 + 来自 Map2 的值)的总和?
我可以迭代 Map2 的每一项并手动添加到 Map1。
但认为可能有更简单的方法?
我更喜欢将整数求和到其中一张地图中。不创建新的
不幸的是,没有简单的方法。您需要手动迭代它们。
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class HashMapSum {
public static void main(String[] args) {
Map<String, Integer> map1 = new HashMap<String, Integer>();
map1.put("a", 1);
map1.put("b", 2);
map1.put("c", 3);
Map<String, Integer> map2 = new HashMap<String, Integer>();
map2.put("a", 4);
map2.put("b", 5);
map2.put("d", 6);
Set<String> keySet = new HashSet<String>();
keySet.addAll(map1.keySet());
keySet.addAll(map2.keySet());
Map<String, Integer> map3 = new HashMap<String, Integer>();
Integer val1, val2;
for (String key : keySet) {
val1 = map1.get(key);
val1 = (val1 == null ? 0 : val1);
val2 = map2.get(key);
val2 = (val2 == null ? 0 : val2);
map3.put(key, val1 + val2);
}
System.out.println(map3.toString());
}
}
因为 Java 8 Map
包含 merge
需要
- 键,
- 新值,
- 和将用于决定将什么值放入地图的函数如果它已经包含我们的键(将根据旧值和新值做出决定)。
所以你可以简单地使用:
map2.forEach((k, v) -> map1.merge(k, v, Integer::sum));
现在您的 map1
将包含来自 map2
的所有值,如果键相同,旧值将添加到新值,结果将存储在映射中。
演示:
Map<String, Integer> m1 = new HashMap<>();
m1.put("a", 1);
m1.put("b", 2);
Map<String, Integer> m2 = new HashMap<>();
m2.put("a", 3);
m2.put("c", 10);
System.out.println(m1);
System.out.println(m2);
//iterate over second map and merge its elements into map 1 using
//same key and sum of values
m2.forEach((k, v) -> m1.merge(k, v, Integer::sum));
System.out.println("===========");
System.out.println(m1);
输出:
{a=1, b=2}
{a=3, c=10}
===========
{a=4, b=2, c=10}
如果你喜欢 Java 8:
Map<String, Integer> sum(Map<String, Integer>... maps) {
return Stream.of(maps) // Stream<Map<..>>
.map(Map::entrySet) // Stream<Set<Map.Entry<..>>
.flatMap(Collection::stream) // Stream<Map.Entry<..>>
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
Integer::sum));
}
可以总结任意数量的地图。它在前几行中将地图数组转换为 Stream<Map.Entry<String, Integer>
,然后将所有条目收集到新的 Map
中,同时在出现重复值时提供 "merge function"。
或者类似于
void addToA(HashMap<String, Integer> a, HashMap<String, Integer> b) {
for (Entry<String, Integer> entry : b.entrySet()) {
Integer old = a.get(entry.getKey());
Integer val = entry.getValue();
a.put(entry.getKey(), old != null ? old + val : val);
}
}