覆盖java地图,添加所有键

时间:2015-06-18 09:50:16

标签: java dictionary

有没有人知道是否有一个地图结构或图书馆可以轻松支持在合并两张地图时添加地图的值。

HashMap<String, Integer> score1 = new HashMap<>();
HashMap<String, Integer> addition = new HashMap<>();

score1.put("Chicaco", 2);
score1.put("New york", 1);

addition.put("New york", 1);
addition.put("Los Angeles", 1);

是否有某种方法可以将score1与加法相结合,以便结果是带有
的地图     “芝加哥” - &gt; 2,
    “纽约” - &gt; 2,
    “洛杉矶” - &gt; 1?

我知道我可以在Map上使用流和新的(Java 8)compute()迭代,但还有其他方法不需要手动迭代吗?

我认为必须有一些比自己处理迭代更好的方法,例如:

addition.forEach((k1, v1) -> score1.compute(k1, (k2, v2) -> v2==null?v1:v1+v2));
score1.forEach((k,v)-> System.out.println(k+":"+v));

4 个答案:

答案 0 :(得分:1)

如果您正在寻找

的替代方案
<head>

然后

addition.forEach((k1, v1) -> score1.compute(k1, (k2, v2) -> v2==null?v1:v1+v2));

似乎有所改善。

所以你的代码看起来也像:

addition.forEach((k, v) -> score1.merge(k, v, (v1, v2) -> v1 + v2));

您也可以使用流重写它,例如:

Map<String, Integer> result = new HashMap<>();
score1.forEach((k, v) -> result.merge(k, v, (v1, v2) -> v1 + v2));
addition.forEach((k, v) -> result.merge(k, v, (v1, v2) -> v1 + v2));

但我发现Map<String, Integer> map2 = Stream.concat( score1.entrySet().stream(), addition.entrySet().stream() ).collect(Collectors.toMap( Entry::getKey, Entry::getValue, (v1, v2) -> v1+ v1) ); 解决方案更清洁了。

答案 1 :(得分:1)

Entry<String, Integer>

的流进行分组
    Map<String, Integer> r = Stream.of(score1, addition)
        .flatMap(map -> map.entrySet().stream())
        .collect(Collectors.groupingBy(e -> e.getKey(),
             Collectors.summingInt(e -> e.getValue())));

答案 2 :(得分:-1)

你可以尝试以下......

score1.putAll(addition);

这会将所有加法值添加到score1。

答案 3 :(得分:-1)

是的,您可以使用Guava Multiset

Multiset<String> score1 = HashMultiset.create();
Multiset<String> addition = HashMultiset.create();

score1.add("Chicaco", 2);
score1.add("New york", 1);

addition.add("New york", 1);
addition.add("Los Angeles", 1);

然后你可以把它们结合起来:

Multiset<String> sum = Multisets.sum(score1, addition);