首页 > 解决方案 > 修剪这组数据的简单方法是什么?(爪哇)

问题描述

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

因此,假设我是一名面包师,并且多年来我有一些关于我的各种产品的数据。例如,我有三种产品:蛋糕、百吉饼和饼干。我的数据每年收集一次,因此 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),除了相应的百吉饼和饼干的平均味道外。

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

到目前为止,我已经考虑为名称、consumerNumbers 和 tastiness 制作 arrayLists,但我意识到这可能有点混乱和不方便。

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

我知道对于我的问题可能存在一个非常简单和简单的解决方案,但它目前还没有出现,所以任何帮助将不胜感激。谢谢 :)

标签: javajsonclassarraylist

解决方案


所以你有多种产品和任意数量的组,你想要工作。

您是否考虑过使用Map? 你可以使用类似的东西Map<String, List<Product>>

您可以使用 Java 8 流(流式传输List<Product>)并根据产品名称进行分组来构建地图。

最后,你可以for-each遍历keySetmap和List of Products中的List

例子:

   List<Product> products = buildProductsList();
   Map<String, List<Product>> productsGroupedByName = products.stream()
      .collect(Collectors.groupingBy(Product::getName));
   for(String name : productsGroupedByName.keySet()) {
      System.out.println("The name is: " + name);
      for (Product product : productsGroupedByName.get(name)) {
          // do something with the products
      }
   }

推荐阅读