2014-09-16 107 views
8

Ben java ve lambda için yeni, bir harita haritasında değerlerin toplamını ve ortalamasını bulmak istiyorum.Java 8'deki Lambda ile bir Harita Haritası olsa da yineleyin mi?

Benim nesnedir Map<String, Map<String, Double>> browserData; gibi

Veri nihai sonuç iki harita, Yani ortalama

map1 = <CountryName, SumValue> 

map2 = <CountryName, AverageValue> 

için toplamı için 1 ve başka olması gerekiyor

<Chrome, <UK, 2.90>> 
<Chrome, <US, 5.20>> 
<Chrome, <EU, -0.25>> 
<IE, <UK, 0.1>> 
<IE, <US, -.20>> 
<IE, <EU, 0.00>> 
<FF, <UK, 0.90>> 
<FF, <US, 1.20>> 
<FF, <EU, 1.25>> 

biçimi olduğunu Yukarıdaki örneğin sonucu,

map1 = <UK, 3.9> 
     <US, 6.2> 
     <EU, 1> 

map2 = <UK, 1.3> 
     <US, 2.07> 
     <EU, 0.33> 

Bunu nasıl başarabilirim? Tek tek toplamı ve ortalama haritalar ihtiyaç yaparsanız

Map<String, DoubleSummaryStatistics> stats = browserData.values().stream() 
     .flatMap(m -> m.entrySet().stream()) //Stream the inner maps' entrySets 
     .collect(groupingBy(Entry::getKey, summarizingDouble(Entry::getValue))); 
DoubleSummaryStatistics ds = stats.getOrDefault("EU", new DoubleSummaryStatistics()); 
System.out.println("sumEu = " + ds.getSum()); 
System.out.println("avgEu = " + ds.getAverage()); 

, oluşturabilir:

+2

Sen denedi kodu sağlamalıdır. Aksi takdirde, bu soru bir * "Bana kodunu ver" * sorusu gibi görünüyor. – jww

cevap

7

fikri iç haritaların girişlerin her akarsu ve ihtiyacınız değerlerini hesaplamak için uygun kolektör uygulamaktır özet haritadan onları:

Map<String, Double> map1 = stats.entrySet().stream() 
     .collect(toMap(Entry::getKey, e -> e.getValue().getSum())); 
Map<String, Double> map2 = stats.entrySet().stream() 
     .collect(toMap(Entry::getKey, e -> e.getValue().getAverage())); 

not: ben kullandım şu statik ithalatı:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summarizingDouble;
import static java.util.stream.Collectors.toMap;

+0

Teşekkür ederim, eserleri çekicilik gibi. Bunu anlamak için şimdi zaman. – victor

İlgili konular