在Java中寻找一种标准的库函数方法,用于根据键在两个映射中添加值。
Map A: {a=1, b=2}
Map B: {a=2, c=3}
结果地图:
Map C: {a=3, b=2, c=3}
我知道这可以用几行编码。我也知道函数式编程对此非常有用。如果有人使用的标准函数或语法,我只是在徘徊。
类似的东西(但可能更通用):
public HashMap<String,Double> addValues(HashMap<String,Double> a, HashMap<String,Double> b) {
HashMap<String,Double> ret = new HashMap<String,Double>(a);
for (String s : b.keySet()) {
if (ret.containsKey(s)) {
ret.put(s, b.get(s) + ret.get(s));
} else {
ret.put(s, b.get(s));
}
}
return ret;
}
答案 0 :(得分:3)
使用Java 8 new getOrDefault
method:
Set<String> keys = new HashSet<> (a.keySet());
keys.addAll(b.keySet());
Map<String, Integer> c = new HashMap<>();
for (String k : keys) {
c.put(k, a.getOrDefault(k, 0) + b.getOrDefault(k, 0));
}
但是如果使用Java 8,你也可以流式传输密钥并使其成为一个内容:
Map<String, Object> c = Stream.concat(a.keySet().stream(), b.keySet().stream())
.distinct()
.collect(toMap(k -> k, k -> a.getOrDefault(k, 0) + b.getOrDefault(k, 0)));
答案 1 :(得分:1)
我认为你在做什么就好了。我可以考虑另一种方式,使用MultiMap。您可以将所有元素添加到多图,然后在最后为每个键的所有值运行求和函数。
答案 2 :(得分:0)
这是一个允许合并任意数量Maps
的版本:
public static Map<String, Integer> addKeys(Map<String, Integer>... maps) {
Set<String> keys = new HashSet<String>();
for (Map<String, Integer> map : maps)
keys.addAll(map.keySet());
Map<String, Integer> result = new HashMap<String, Integer>();
for (String key : keys) {
Integer value = 0;
for (Map<String, Integer> map : maps)
if (map.containsKey(key))
value += map.get(key);
result.put(key, value);
}
return result;
}
用法:
public static void main(String[] args){
Map<String, Integer> a = new HashMap<String, Integer>();
a.put("a", 1);
a.put("b", 2);
Map<String, Integer> b = new HashMap<String, Integer>();
b.put("a", 2);
b.put("c", 3);
Map<String, Integer> c = addKeys(a, b);
System.out.println(c);
}
Ouptut:
{b=2, c=3, a=3}
不幸的是,就我所知,创建一个通用方法是不可能的:
public static <K, V extends Number> Map<K, V> addKeys(Class<V> cls, Map<K, V>... maps);
因为Number
类不支持+
运算符。这似乎有点愚蠢......