【问题标题】:calculate averages of multiple values in java在java中计算多个值的平均值
【发布时间】:2016-11-18 18:02:31
【问题描述】:

我有一个如下所示的列表:

40   4.8980713
5   4.8012613
5   4.8980713
46   4.8980713
5   4.8980713
5   4.8945613
40   4.0120713
5   4.8980713
5   4.8828129
5   4.8000713
40   4.8947213
5   4.8980713
46   4.8980713
5   4.8828125
46   4.8980713

这是一个更大列表的快照,其中包含节点的值及其到达时间。我需要在右列中找到左列中每个节点的平均到达时间。

我不确定如何在 Java 中使用 Lists 来解决这个问题。

【问题讨论】:

  • 您将如何使用另一种语言(或用笔和纸手动)?
  • 这是来自文件的列表吗?
  • @Seelenvirtuose 循环遍历每一行的数组列表。为每个节点添加时间值,并在每次遇到节点时创建一个计数器,或者创建新节点值的新计数器。最后,将所有时间的总和除以每个节点的计数器。
  • @iambdot 是的,这是来自 csv 的列表
  • 解析CSV文件时可以计算平均时间,完全不需要Java Lists。除非您需要稍后出于其他目的操作该列表。

标签: java list average


【解决方案1】:

您可以先将 CSV 文件读取到List<String>。然后通过在三个空格上拆分它来解析它。然后将其收集到Map<Integer, Double>,其中键是您的节点,值是平均值。您可以使用Collectors 中的averagingDouble

代码如下所示:

List<String> lines = Files.readAllLines(Paths.get("/path/to/arrivals.csv"));

Map<Integer, Double> averages = lines.stream()
                                     .map(s -> s.split("   "))
                                     .collect(
                                        Collectors.groupingBy(
                                           r -> Integer.parseInt(r[0]),
                                           Collectors.averagingDouble(v -> Double.parseDouble(v[1]))
                                        )
                                     );

如果你为你的例子运行这个,你会得到:

{5=4.872644944444445, 40=4.6016213, 46=4.8980713}

【讨论】:

  • 谢谢!!所以这就是你想要做的事情:1. 将文件读入流 2. 通过 \t 分割每个流 3. 收集单个节点值以及时间(再次收集平均值)
  • 很高兴为您提供帮助。这确实是代码的作用。这不是真正的尝试,它实际上是工作代码;我写了一个单元测试,你的例子的输出也在答案中提供。注意 \t 是制表符,问题中的示例不使用制表符而是使用 3 个空格。
  • 再次感谢您的澄清。我不可能这么快就想出这个简洁的代码。我今天确实学到了一些新东西。
猜你喜欢
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
相关资源
最近更新 更多