有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java对每个键的映射值求和

我有以下地图:

{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()返回单个映射。对于我上面给出的示例,我有四个色度,其中每个色度将返回一个单独的映射

我想分别对每个键的值求和,以便最终结果为:

21 = 14
22 = 9
11 = 22
12 = 4

是否可以使用stream来实现这一点?如果没有,我怎么做


共 (3) 个答案

  1. # 1 楼答案

    您可以创建地图流,并使用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上播放流媒体
    • Map中包含的所有条目创建唯一的Stream
    • 按键分组
    • 对于冲突,使用Integer::sum,这将减少同一个键的两个值
  3. # 3 楼答案

    试试这个:

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