2017-05-05 64 views
3

我有两个HashMap<String, Integer>我怎样才能得到的平均值?得到两个+ HashMap的平均值使用Java 8

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

如果你已经有了这个总和,那么你除了把它除以2并得到平均值是什么? – kichik

+0

我尝试:'mp.forEach((K,V) - > map2.merge(K,V,整型::总和)/ 2)',但我不能这个表达式内划分( “空隙方法不能返回一个值”) –

+0

@kichik取决于他的平均含义。我认为它是'sum /(map1.values()。size()+ map2.values()。size())' – Michael

回答

4

你试着这样做:

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

对于3个HashMaps这样的价值观的方式:100,59和100这样产生的结果是:'89.76225' 。如果我加上'100 + 59 + 100 = 259'和**,然后**将259除以'3',则产生'86.3'的结果。如何修改此代码以便产生相同的结果? –

+0

所以你使用3个地图而不是2 @LittleKevin对不对?你能告诉我你的代码吗? –

+0

我实际上有地图格式的数组:'的HashMap <字符串,HashMap中<字符串,双>>地图;'我通过外'地图迭代',然后用相同的所有字符串平均所述''双值价值(所以可以有任何数量的地图)。你想让我发布这部分代码吗? –

0

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

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

...因为你没有得到预期的输出? –

+0

@RobinTopper无论如何,OP都会遇到一些舍入误差(如上面注释中所述) – Dummy

+0

这个想法是将平均值通过键合并到第一个地图中。你很酷,但做了一些不同的事情。 –