gpt4 book ai didi

java - 修剪这组数据的简单方法是什么? ( java )

转载 作者:行者123 更新时间:2023-11-30 06:40:35 26 4
gpt4 key购买 nike

我正在练习用 Java 处理简单的 JSON 数据,但我有点卡住了。

假设我是一名面包师,多年来我有一些关于我的各种产品的数据。例如,我有三种产品:蛋糕、百吉饼和 cookies 。我的数据每年收集一次,因此 JSON 数据集示例可能类似于:

[ {"name": "cake", "consumers": 200, "tastiness": 8.0}, {"name": "cake", "consumers": 220, "tastiness": 8.3}, {"name": "bagel", "consumers": 1000, "tastiness": 6.4}, {"name": "bagel", "consumers": 1200, "tastiness": 7.5}, {"name": "bagel", "consumers": 800, "tastiness": 5.7}, {"name": "cookie", "consumers": 500, "tastiness": 9.6} ]

如您所见,有两个“cake”条目表示蛋糕已存在两年,三个“bagel”条目表示百吉饼已存在三年,等等。

我想压缩这些数据以获得每种产品的加权平均味道。例如,蛋糕的平均味道是 (8.0*200 + 8.3*220)/(200+220) = 8.157,所以我希望我的新集合包含一个值为 ("cake", 8.157) 的数据条目,除了百吉饼和 cookies 相应的平均味道。

解析 JSON 数据并提取我想要的值是微不足道的,但我正在努力解决的是提取/压缩具有相同名称的数据值并获得平均味道的最佳方法。

到目前为止,我已经考虑过为名称、消费者编号和味道制作数组列表,但我意识到这可能有点困惑和不方便。

我目前正在考虑制作一个名为“Product”的单独类,其属性为“name”、“consumers”和“tastiness”,然后创建一个single arrayList<Product> .但是,我坚持如何最好地遍历产品的 arrayList 并获取具有相同名称的产品并计算加权平均值。

我知道可能存在一个非常简单的解决方案来解决我的问题,但目前我还没有找到它,所以我们将不胜感激。谢谢:)

最佳答案

我认为您创建具有上述属性的容器类的想法是个好主意。

groupingBy 的组合和 reducing来自 java.util.stream.Collectors类,你可以做到这一点。

我们首先定义一个类来保存我们的数据:

public class SugarStats {
private String name;
private long consumers;
private double tastiness;

// Constructor(name, consumers, tastiness) and getters left out for brevity
}

我们将使用这个容器类来为我们提供平均值,因此我们将添加一个方法:

public double getAverageTastiness() {
return this.tastiness / this.consumers;
}

此外,我假设已经完成了从 JSON 到 POJO 的转换,并且您的数据如下所示:

List<SugarStats> stats = Arrays.asList(
new SugarStats("cake", 200, 8.0),
new SugarStats("cake", 220, 8.3),
new SugarStats("bagel", 1000, 6.4),
new SugarStats("bagel", 1200, 7.5),
new SugarStats("bagel", 800, 5.7),
new SugarStats("cookie", 500, 9.6));

然后我们将执行以下操作:

  1. 我们将流式传输列表:

    stats.stream()
  2. 然后我们将总结每个 SugarStats 的总美味分数,而不是单个条目的分数:

    .map(t -> new SugarStats(t.getName(), t.getConsumers(), t.getConsumers() * t.getTastiness()))

    例如,cookie sugarstats 实例现在的口味是 500 * 9.6 = 4800

  3. 然后我们收集结果,按名称分组。这通常会返回 Map。与 name作为键和一个 List<SugarStats>具有所有值。但是,我们对 List 不感兴趣,我们只对平均值感兴趣。因此,我们提供了一个reducing 下游收集器,它收集所有 SugarStats 并将它们组合在一起,计算出消费者数量和味道。

    例如,new SugarStats("cake", 200, 1600.0) + new SugarStats("cake", 220, 1826.0)将变为 new SugarStats("cake", 420, 3426) .

    .collect(groupingBy(t -> t.getName(),
    reducing(
    new SugarStats("", 0, 0),
    (p1, p2) -> new SugarStats(
    p2.getName(),
    p1.getConsumers() + p2.getConsumers(),
    p1.getTastiness() + p2.getTastiness()
    )
    )
    ));

现在我们可以得到美味了:

result.values().stream()
.forEach(t -> System.out.println(t.getName() + ": " + t.getAverageTastiness()));

Ideone example here .

关于java - 修剪这组数据的简单方法是什么? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57897008/

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