每个键汇总地图值

时间:2019-04-23 10:32:28

标签: java

我有以下地图:

>>> all('' < chr(i) for i in range(0x110000))
True

以下代码返回这些映射:

{21=0, 22=2, 11=0, 12=0}
{21=3, 22=0, 11=6, 12=3}
{21=6, 22=0, 11=7, 12=0}
{21=5, 22=7, 11=9, 12=1}

方法for (Chrom t: obj.getChroms) { Map<Integer, Integer> result = t.getExecutionCount(); } 返回一个地图。对于上面给出的示例,我有四个色度,其中每个色度将返回一个图。

我想分别汇总每个键的值,以便最终结果将是:

getExecutionCount()

是否可以使用流来做到这一点?如果没有,我该怎么办?

3 个答案:

答案 0 :(得分:8)

尝试一下:

    List<Map<Integer, Integer>> maps;

    Map<Integer, Integer> result = maps.stream()
            .map(Map::entrySet)
            .flatMap(Collection::stream)
            .collect(Collectors.groupingBy(
                    Map.Entry::getKey,
                    Collectors.summingInt(Map.Entry::getValue)));

答案 1 :(得分:7)

您可以创建地图流,并使用flatMap

Stream.of(map1, map2, map3)
      .flatMap(m -> m.entrySet()
                     .stream())
      .collect(Collectors.groupingBy(
                   Map.Entry::getKey,
                   Collectors.summingInt(Map.Entry::getValue)
               )
      );

答案 2 :(得分:2)

可以使用Stream。它应该可以工作(不幸的是我现在无法编译)

Map<Integer, Integer> result = Stream.of(map1, map2, map3, map4)
                                     .map(Map::entrySet)
                                     .flatMap(Set::stream)
                                     .collect(Collectors.toMap(
                                                  Map.Entry::getKey,
                                                  Map.Entry::getValue,
                                                  Integer::sum)
                                     );

一些解释

  • 流式传输您所有的Map
  • Stream内包含的所有条目进行唯一的Map
  • 按键将每个分组
  • 对于碰撞,请使用Integer::sum,这将减少同一键的两个值