【问题标题】:Get Average Value of Two+ HashMap using Java 8使用 Java 8 获取两个以上 HashMap 的平均值
【发布时间】:2017-05-05 16:22:59
【问题描述】:

我有两个HashMap<String, Integer> 我怎样才能得到这些值的平均值?

HashMap<String, Integer> map1 = ...
map1.put("str1", 7);
map1.put("str2", 4);

HashMap<String, Integer> map2 = ...
map2.put("str1", 3);
map2.put("str2", 2);

预期的输出是:

("str1") = 5;
("str2") = 3;

我能够按如下方式检索两张地图的总和:

map2.forEach((k, v) -> map1.merge(k, v, Integer::sum)); 

但是如何使用 Java 8 检索两个地图的平均值?

更新:

应@的要求,我发布了我的大部分代码:

HashMap<String, HashMap<String, Double>> map;

        HashMap<String, Double> map2 = new HashMap<String, Double>();
        map = func1(); 
        map = func2();
        map = func3();

        for (Entry<String, HashMap<String, Double>> entry : map.entrySet()) {
            String key = entry.getKey();
            HashMap<String, Double> mp = map.get(key);
            mp.forEach((k, v) -> map2.merge(k, v, (t, u) -> (t + u) / 2));

            for (Entry<String, Double> entry1 : mp.entrySet()) {

                StringfieldName = entry1.getKey();
                Double score= entry1.getValue();
                System.out.println(fieldName.toString() + " = " + score);

            }
        }
        return map2;
    }

【问题讨论】:

  • 如果您已经有了总和,那么是什么阻止您将其除以 2 并得到平均值?
  • 我试过了:mp.forEach((k, v) -&gt; map2.merge(k, v, Integer::sum) / 2) 但我不能在这个表达式中进行除法(“Void 方法不能返回值”)
  • @kichik 取决于他的平均意思。我以为是sum / (map1.values().size() + map2.values().size())
  • 如果您期望浮点结果,您还需要注意整数除法。
  • 您的解决方案似乎是正确的(有时它会偏离几个整数,例如它 avg 280 / 3 = 95 而不是 93.3 但这可能是因为我使用的是整数而不是双倍)但总的来说它是正确的做法。我会删除我的答案并接受你的。

标签: java java-8 hashmap java-stream


【解决方案1】:

您是否尝试过这样做:

map1.forEach((k, v) -> map1.merge(k, v, (t, u) -> (t + u) / 2));

【讨论】:

  • 对于 3 个值为 100、59 和 100 的 HashMap,这会产生以下结果:89.76225。如果我添加 100 + 59 + 100 = 259then 将 259 除以 3 它会产生 86.3 的结果如何修改此代码以使其产生相同的结果?
  • 所以您使用的是 3 张地图而不是 2 张 @LittleKevin 对吗?你能告诉我你的代码吗?
  • 我实际上有一个映射数组,格式为:HashMap&lt;String, HashMap&lt;String, Double&gt;&gt; map; 我正在遍历外部Map ,然后对具有相同值的所有字符串的Double 值进行平均(因此可以是任意数量的地图)。要我发布这部分代码吗?
  • @LittleKevin 我认为您制作了类似System.out.println((((100 + 59) / 2) + 100) / 2); 的东西,但这与System.out.println((100 + 59 + 100) / 3); 不一样,您明白我的意思吗?
【解决方案2】:

为什么不完全利用 Java 8 的特性?

double avg = Stream.of(map1.values(), map2.values())
                   .map(set -> set.stream().collect(Collectors.summingInt(Integer::intValue)))
                   .collect(Collectors.averagingDouble(Integer::doubleValue));

【讨论】:

  • ...因为您没有得到预期的输出?
  • @RobinTopper OP 无论如何都会出现一些舍入错误(如上面的评论所述)
  • 这个想法是通过键将平均值合并到第一张地图中。你的很酷,但做了一些不同的事情。
  • 正是@AlexPakka。我就是这个意思
  • @AlexPakka 明白了,当我发布答案时没有考虑清楚,以为 OP 只是想计算平均值
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
相关资源
最近更新 更多