2016-10-19 13 views
1

[JAVA]同じ値の出現をカウントする1つのマップを複数のマップから取得するにはどうすればよいですか?あなたはマップを含むlistOfMapsを持っていると仮定します:複数のマップを同じ値の出現をカウントするものに集計する方法

Map<String, String> m1 = new HashMap<>(); 
     m1.put("color", "red"); 
     m1.put("size", "big"); 
     m1.put("volume", "low"); 

    Map<String, String> m2 = new HashMap<>(); 
     m2.put("color", "red"); 
     m2.put("size", "small"); 
     m2.put("volume", "medium"); 

    Map<String, String> m3 = new HashMap<>(); 
     m3.put("color", "blue"); 
     m3.put("size", "medium"); 
     m3.put("volume", "high"); 

    List<Map<String,String>> listOfMaps = Arrays.asList(m1, m2, m3); 

各キーの出現回数と同じ値の頻度はどのようにして計算されますか?

1) 結果{体積= {高= 1、ロー= 1、中= 1}、色= {赤= 2、青= 1}、サイズ= {小さな= 3}}

2 ) 結果{volume = {high = 0.33、low = 0.33、medium = 0.33}、color = {red = 0.66、blue = 0.33}、サイズ= {small = 1.0}}

答えて

1

Streamこれらすべての情報。しかし、 "確率"の計算は静かです。

import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.stream.Collector; 

import static java.util.stream.Collectors.*; 

public class Use { 

    public static void main(String[] args) { 
     Map<String, String> m1 = new HashMap<>(); 
     m1.put("color", "red"); 
     m1.put("size", "small"); 
     m1.put("volume", "low"); 

     Map<String, String> m2 = new HashMap<>(); 
     m2.put("color", "red"); 
     m2.put("size", "small"); 
     m2.put("volume", "medium"); 

     Map<String, String> m3 = new HashMap<>(); 
     m3.put("color", "blue"); 
     m3.put("size", "small"); 
     m3.put("volume", "high"); 

     List<Map<String, String>> listOfMaps = Arrays.asList(m1, m2, m3); 

     Map<String, Map<String, Long>> occurences = compute(listOfMaps, counting()); 
     Map<String, Map<String, Double>> frequencies = compute(listOfMaps, collectingAndThen(counting(), l -> (double)l/listOfMaps.size())); 

     System.out.println(occurences); //prints {volume={high=1, low=1, medium=1}, size={small=3}, color={red=2, blue=1}} 
     System.out.println(frequencies); //prints {volume={high=0.3333333333333333, low=0.3333333333333333, medium=0.3333333333333333}, size={small=1.0}, color={red=0.6666666666666666, blue=0.3333333333333333}} 

    } 

    private static <T> Map<String, Map<String, T>> compute(List<Map<String, String>> data, Collector<Entry<String, String>, ?, T> finalComputation) { 
     return data.stream() 
        .flatMap(m -> m.entrySet().stream()) 
        .collect(groupingBy(Entry::getKey, 
          groupingBy(Entry::getValue, finalComputation))); 
    } 
} 
+0

グレート。どうもありがとう。その第二のものは私のために特にトリッキーでした。 –

関連する問題