【问题标题】:Overlay java maps, adding all keys覆盖java地图,添加所有键
【发布时间】:2015-06-18 18:40:43
【问题描述】:

有谁知道是否有地图结构或库可以轻松支持在组合两个地图时将地图的值相加。

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 与加法结合起来,以便结果是一个带有
的地图 “芝加哥”-> 2,
“纽约”-> 2,
“洛杉矶” -> 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));

【问题讨论】:

  • Sashi 是最接近的,但几乎每个人都没有看到纽约必须更新为每张地图中纽约的值总和。那就是 -> 2

标签: java dictionary


【解决方案1】:

如果您正在寻找替代方案

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)
);

但我发现forEach 解决方案更清洁。

【讨论】:

    【解决方案2】:

    Entry&lt;String, Integer&gt;的流进行分组:

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

    【讨论】:

    • 此解决方案删除了​​洛杉矶
    • @Billybong 不,结果是{Chicaco=2, New york=2, Los Angeles=1}
    【解决方案3】:

    你可以试试下面的......

    score1.putAll(addition);
    

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

    【讨论】:

    • 不,它不会为现有项目增加价值。所以结果将是:“芝加哥”-> 2、“纽约”-> 1、“洛杉矶”-> 1
    【解决方案4】:

    是的,你可以使用 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多