2017-07-06 2 views
1

Ich habe eine Karte strukturiert alsWie beliebtesten Elemente in mehreren Sätzen finden

Map<String, Set<String> myMapOfSets = new HashSet<>():

Diese Karte folgt der Größe 400. Und jeder dieser 400 Sätze kann irgendwo zwischen 100 bis 10.000 von Größe sein Elemente. Viele Elemente in diesen Sets wiederholen sich. Ich suche nach Top 10 Elementen, die in diesen 400 Sets am beliebtesten sind. Wie implementiert man das? Danke für jede Hilfe.

+2

einen Versuch, sich her, bevor Sie fragen das Komm Einheit, um es für dich zu tun. Wenn Sie ein Problem haben, bitten Sie um Hilfe. –

+1

Ich rieche Hausaufgaben. Was hast du bisher versucht? –

+0

Was bezieht sich zwischen der Zeichenfolge und Set ? Wenn die Karte nur eine Sammlung von Mengen ist, dann ist es trivial. –

Antwort

1

mit Java 8 Streams:

Map<String, Set<String>> myMapOfSets = new HashMap<>(); 
myMapOfSets.put("K1", new HashSet<>(Arrays.asList("A", "B", "C",  "E" ))); 
myMapOfSets.put("K2", new HashSet<>(Arrays.asList( "B", "C", "D",  "F"))); 
myMapOfSets.put("K3", new HashSet<>(Arrays.asList("A",  "C",  "E", "F"))); 
myMapOfSets.put("K4", new HashSet<>(Arrays.asList( "B", "C", "D"   ))); 
myMapOfSets.put("K5", new HashSet<>(Arrays.asList("A",  "C", "D"   ))); 
myMapOfSets.put("K6", new HashSet<>(Arrays.asList( "B", "C", "D", "E", "F"))); 

List<Entry<String, Long>> result =   // change to List<String> if you only want values 
     myMapOfSets.values() 
        .stream() 
        .flatMap(Set::stream) 
        .collect(Collectors.groupingBy(s -> s, Collectors.counting())) 
        .entrySet() 
        .stream() 
        .sorted((e1, e2) -> Long.compare(e2.getValue(), e1.getValue())) // descending 
        .limit(3)     // change to 10 for your code 
       // .map(Map.Entry::getKey) // uncomment if you only want values 
        .collect(Collectors.toList()); 
result.forEach(System.out::println); 

Ausgabe

C=6 
B=4 
D=4 
0

Wenn diese Hausaufgaben im Zusammenhang sind, ist hier einige Tipps:

die Karte Unter der Annahme, kann als ein Satz von Sätzen behandelt werden, und dass der String-Schlüssel bezogen arn't.

Create a new map called scores, store strings and ints 
Iterate over the sets 
    Iterate over the values of a set 
    get the value of the string from scores defaulting to 0, and add 1. 

Sie jetzt eine Karte von Vorkommen haben,

create a list of mapentries of length 10, keep it sorted. 
Loop over the map 
    if the current value is higher then the min value in the list, replace the lowest value, and keep track of the new minimumscore. 
Verwandte Themen