2017-12-24 4 views
-2

Ich muss die Häufigkeit der Wörter im Array zählen. Und handle result (ich denke es muss ein entrySet sein) ... Auch eine Reihenfolge des entrySet ist wichtig. Also ich nehme an, dass Array muss in LinkedHashMap ...Java 8-Stream. Konvertiere Array in LinkedHashMap und arbeite weiter mit dem EintragSet im Single-Stream

Map<String, Integer> map = new LinkedHashMap<>(); 
for(String word : words) { 
     Integer count = map.get(word); 
     count = (count == null) ? 1: ++count; 
     map.put(word, count); 
}  

Ich habe die nächste Lösung, aber die Reihenfolge wird nicht respektiert. Und ist es möglich, diesen Stream ohne Sammelvorgang zu verwenden (aber mit map oder flatMap)?

Map<String, Long> collect = 
    wordsList.stream().collect(groupingBy(Function.identity(), counting())); 

Vielen Dank.

+0

Warum denken Sie, diese groupingBy Sammler eine LinkedHashMap schaffen sollte? Gibt es keinen anderen Kollektor, der nach Gruppen gruppiert, sondern die Art der zu erstellenden Map angibt? Hast du den Javadoc der Sammler gelesen? Sammler sieht gut aus für meine Aufgabe –

+0

@JBnizet, wie ich groupingBy verstehen, aber es nicht schaffen LinkedHashMap ... Ich frage nur, wie es zu machen, um zu halten ... und wie Verwendung gleichen Strom fortsetzen, aber mit neuen konvertierten Artikeln ... –

+0

Ich verstehe das. Mein Punkt ist, dass Sie, wenn Sie nur das Javadoc lesen, die Antwort selbst finden könnten. Das Lesen der Dokumentation ist der Schlüssel, um ein autonomer, produktiver Programmierer zu werden. –

Antwort

0

Sie in der Nähe sind, aber Sie werden die groupingBy Sammler verwenden müssen, die drei Argumente wie dies geschieht:

LinkedHashMap<String, Long> resultSet = 
       wordsList.stream() 
         .collect(groupingBy(Function.identity(), 
             LinkedHashMap::new, 
              counting())); 

Das zweite Argument der groupingBy Sammler der Lieferant und in Ihrem Fall ist, da Sie wollen dann müssen Sie wie oben gezeigt bereitstellen.

+0

Vielen Dank! Es ist Arbeit. Noch eine Frage. Wie konvertiert man es, ohne Collect zu verwenden? Ich meine, nach der Konvertierung möchte ich diesen Stream weiter verwenden ... z. zum Sortieren nach Eingabewerten ... Soll ich einen neuen Stream aus der Ergebniskarte erstellen? Oder gibt es etwas Magie (z. B. map oder flatMap)? –

+0

@ A.Yam eine Lösung, die ich jetzt denken kann, ist mit [ 'collectingAndThen'] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html# collectingAndThen-java.util.stream.Collector-java.util.function.Function-) collector, um nach dem groupingBy eine Finishing-Funktion anzuwenden und nach Wert zu sortieren, abgesehen davon, dass Sie möglicherweise einen neuen Stream erstellen und nach Wert sortieren müssen. –

Verwandte Themen