gpt4 book ai didi

java - 如何使用java流根据键将map的值分组到列表中?

转载 作者:行者123 更新时间:2023-12-02 01:05:25 24 4
gpt4 key购买 nike

假设我有从字符串到字符串到 int 的映射,例如

Map<String, Map<String, Integer>> myMap1 = new HashMap<>();
myMap1.put("A", Map.of("X", 1))
myMap1.put("B", Map.of("Y", 1))

Map<String, Map<String, Integer>> myMap2 = new HashMap<>();
myMap2.put("B", Map.of("Y", 3))

我想合并这些映射,以便我们得到一个映射,其中键是内部映射的键,值是相同键的内部映射值的平均值。因此上面示例的输出将是

{"X" : 1, "Y", 2}

我们可以完全丢弃外部 map 的 key 。

使用 java.util.Date 实现此目的最好的方法是什么?我认为可能有一些很好的方法可以使用 Collectors.groupBy 方法来完成此操作,但我对此缺乏经验。

最佳答案

我假设可能有两个以上的 map ,所以让我们用它们创建一个列表:

    Collection<Map<String, Map<String, Integer>>> myMaps =
List.of(myMap1, myMap2);

然后我们就可以在values()上使用flatMap了每个 Map 的数据流,为我们提供了 Map<String, Integer> 的流 map 。

我们可以获得entrySet()其中每个,然后将 flatMap 应用于这些条目集的流,为我们提供 Map.Entry<String, Integer> 的单个流对象,然后我们可以将其分组。

有一个groupingBy method which takes a second Collector通过收集所有看到的分组值来自定义组的值。我们可以使用 averaging collector 来获取平均值。 .

Map<String, Double> averages =
myMaps.stream().flatMap(map -> map.values().stream()) // stream of Map<String, Integer>
.flatMap(innerMap -> innerMap.entrySet().stream()) // stream of Map.Entry<String, Integer>
.collect(Collectors.groupingBy(Map.Entry::getKey, // group by String key
Collectors.averagingInt(Map.Entry::getValue))); // value for each key = average of its Integers

关于java - 如何使用java流根据键将map的值分组到列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60105208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com