gpt4 book ai didi

Android 从 map 流平均

转载 作者:行者123 更新时间:2023-11-30 00:24:50 24 4
gpt4 key购买 nike

我有一个对象列表

class Result {
private String name;
private Map<String, Double> map;

// getters, constructor etc
}

我想按名称对其进行分组,并为每个键计算映射中 double 值的平均值。列表中的每个对象都有具有相同键的映射。

我从按名字分组开始

Map <String, List<Result>> grouppedByName = Stream.of(results)
.collect(Collectors.groupingBy(Result::getName));

我不知道常规循环的下一部分是什么。

示例数据:

INPUT:

name = "Name 1"
map:
KEY1, 10
KEY2, 1

name = "Name 1"
map:
KEY1, 20
KEY2, 7

name = "Name 2"
map:
KEY1, 2
KEY2, 3
--------------
OUTPUT:

name = "Name 1"
map:
KEY1, 15 (10+20)/2 = 15
KEY2, 4 (1+7)/2 = 4

name = "Name 2"
map:
KEY1, 2
KEY2, 3

最佳答案

groupingBy方法将产生 Map<String, List<Result>> .我们需要一种方法来转换 List<Result>此映射的值到更有用的东西:

Map<String, Double> mapMerger(final List<Result> results) {
return results.stream()
.map(Result::getMap)
.map(Map::entrySet)
.flatMap(Set::stream)
.collect(groupingBy(Entry::getKey, averagingDouble(Entry::getValue)));
}

这将提取类型为 Entry<String, Double> 的所有条目来自所有结果中的所有 map 。它将这些条目聚合到一个映射中,从每个键到该键的所有值的平均值。

我们可以通过从原始 map (您的问题中的 grouppedByName)创建一个流来应用这种新方法:

Map<String, Map<String, Double>> averagedByName = results.stream()
.collect(groupingBy(Result::getName))
.entrySet().stream()
.collect(toMap(Entry::getKey, e -> mapMerger(e.getValue())));

你应该得到 15如果你这样做:

double avg = averagedByName.get("Name 1").get("KEY1");

关于Android 从 map 流平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45585511/

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