2017-02-10 2 views
-1

Ich brauche für jede Saite eine Anzahl von Vorkommen zählt inJava 8 gezählte Anzahl der Duplikate für jeden String in Arraylist von Arraylists

ArrayList<ArrayList<String>> 

Ich weiß, wie es die alte Java 7 und unten Art und Weise zu tun, aber möchte es mit Streams und Kollektoren tun

Idealerweise würde ich das Ergebnis in der HashMap<String, Integer> speichern, wobei Integer ist eine Anzahl von Vorkommen und String ist die entsprechende Zeichenfolge.

Dies kann umgekehrt sein - keine große Sache.

Ich fand Lösung, wie es zu tun für ArrayListhere

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

aber mein Fall ist komplizierter, da es ein ArrayList von ArrayList s ist.

Die Struktur folgt String itemId = list.get(i).getProducts().get(j).getItemId();

+4

Was meinen Sie mit „Anzahl der Duplikate zählen“? Meinst du "Anzahl der Vorkommen"? – Holger

Antwort

5

Wenn Sie die Anzahl der Vorkommen zählen möchten, unabhängig davon, in welchem ​​Teilliste die Zeichenfolgen erscheinen, Sie Integer als Wert verwenden können, wenn

Map<String, Long> counts = list.stream().flatMap(List::stream) 
    .collect(Collectors.groupingBy(e -> e, Collectors.counting())); 

Geben Sie

Map<String, Integer> counts = list.stream().flatMap(List::stream) 
    .collect(Collectors.groupingBy(e -> e, Collectors.summingInt(x -> 1))); 

statt.

Zusätzlich kann eine Lösung auf herkömmlichen Schleifen basieren, können auch von Java 8-Funktionen profitieren:

Map<String, Integer> counts = new HashMap<>(); 
for(List<String> l: list) 
    for(String s: l) 
     counts.merge(s, 1, Integer::sum); 
+0

Ich erhalte den folgenden Fehler (für die erste Option, die Sie erwähnten). Mehrere Marker an dieser Linie \t - Stream kann nicht \t aufgelöst werden - Typenkonflikt: kann nicht von Strom umwandeln zu \t Andrei

+0

Nun, wenn es sagt, „Strom kann nicht aufgelöst werden“, haben schwerwiegende Probleme in Ihrem Projekt-Setup , da der obige Code keinen Verweis auf "Stream" enthält. Überprüfen Sie jedoch, ob Sie alle von Ihnen verwendeten Typen korrekt importiert haben. Oder meinst du "Stream" (Kleinbuchstaben)? Der obige Code geht davon aus, dass Sie eine 'ArrayList >' haben, wie Sie in Ihrer Frage angegeben haben, und nicht eine Methode, die fünf Tage später eine 'getProducts()' -Methode erhält. – Holger

+0

Sie können das beheben, indem Sie '.flatMap (List :: stream)' in '.flatMap (o-> o.getProducts(). Stream())' ändern, aber in Zukunft sollten Sie eine korrekte Problembeschreibung angeben poste deine Frage zuerst. – Holger

Verwandte Themen