【问题标题】:How to take the average of values of several HashMaps in Array of HashMaps efficiently?如何有效地取 HashMaps 数组中几个 HashMaps 的值的平均值?
【发布时间】:2019-04-10 22:55:26
【问题描述】:

我有一个 HashMap 列表

List<Map<String, Object>> arrOfMaps = new ArrayList<>();

所有HashMap的key相同,且所有HashMap中key的个数相同。

现在,我想连续取 HashMap 中所有键的所有值的平均值。

例如,假设下面是我从 HashMaps 数组中得到的 HashMaps

arrOfMaps[0]={
A:1,
B:1
}

arrOfMaps[1]={
A:4,
B:5
}

arrOfMaps[2]={
A:4,
B:7
}

.
.
.

我想从 3 个连续的 HashMap 中得到 A 的平均值,即 A_avg = (1+4+4)/3、B_avg=(1+5+7)/3 等等。

有什么有效的方法可以做到这一点?

【问题讨论】:

  • 为什么值是Object 而不是Integer
  • 我收到了带有无法更改的 Object 值的 HashMap。我需要将其转换为 Double/Integer 以取平均值。

标签: java arraylist hashmap


【解决方案1】:

您可以使用流找到平均值:

Map<String, Double> average = arrOfMaps.stream()
    .flatMap(map -> map.entrySet().stream())
    .collect(Collectors.groupingBy(Map.Entry::getKey, 
             Collectors.averagingInt(value -> (Integer)(value.getValue()))));

System.out.println(average);  // {A=3.0, B=4.333333333333333}

使用flatMap,您将获得所有传入地图的条目流。接下来,您将按字符串键进行分组,并分别使用 groupingByaveragingInt 获取每个键的平均值

【讨论】:

  • averagingDouble 代替 averagingInt?
  • 不清楚他们实际上是Integers。投射到Number 并调用intValue() 可能更安全。
  • @tank 很高兴为您提供帮助!如果有帮助别忘了采纳答案
猜你喜欢
  • 2010-10-25
  • 2021-06-19
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多