在相同的键时添加两个映射的值

时间:2014-07-01 14:56:54

标签: java map

在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;
  }

3 个答案:

答案 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类不支持+运算符。这似乎有点愚蠢......