Java 8 - Entfernen Sie wiederholte Sequenz von Elementen aus einer Liste

8

Ich habe eine Anforderung, bei der ich Java Stream Api verwenden möchte, um einen Stream von Ereignissen von einem System zu verarbeiten und einen Datenbereinigungsprozess anzuwenden, um wiederholte Ereignisse zu entfernen. Dadurch wird das gleiche Ereignis mehrfach hintereinander gelöscht, und es wird keine Liste eindeutiger Ereignisse erstellt. Die meisten Java Stream API-Beispiele, die online verfügbar sind, zielen darauf ab, eine bestimmte Ausgabe von einer gegebenen Eingabe zu erzeugen.

Beispiel für den Eingabestream

  

[a, b, c, a, a, a, a, d, d, d, c, c, e, e, e, e, e, e, f, f, f]

Die Ausgabe-Liste oder der Stream sollte

sein
  

[a, b, c, a, d, c, e, f]

Meine aktuelle Implementierung (ohne Stream api) sieht wie

aus %Vor%

Ausgabe,

%Vor%

Ich habe verschiedene Beispiele mit reducing, groupingBy usw. ausprobiert, ohne Erfolg. Ich kann anscheinend keinen Weg finden, einen Strom mit dem letzten Element in meinem Akkumulator zu vergleichen, wenn es eine solche Möglichkeit gibt.

    
Amitoj 16.01.2017, 11:28
quelle

4 Antworten

5

Sie können IntStream verwenden, um die Indexpositionen in List zu erhalten und wie folgt zu Ihrem Vorteil zu verwenden:

%Vor%

Erläuterung

  1. IntStream.range(0,list.size()) : Gibt eine Sequenz von primitiven int-wertigen Elementen zurück, die als Indexpositionen für den Zugriff auf die Liste verwendet werden.
  2. filter(i -> ((i < list.size() - 1 && !list.get(i).equals(list.get(i + 1) || i == list.size() - 1)) : Fortfahren nur, wenn das Element an der aktuellen Indexposition ungleich dem Element an der nächsten Indexposition ist oder wenn die letzte Indexposition erreicht ist
  3. mapToObj(i -> list.get(i) : Konvertiere den Stream in ein Stream<String> .
  4. collect(Collectors.toList()) : Sammeln Sie die Ergebnisse in einer Liste.
CKing 16.01.2017, 14:10
quelle
1

Sie können einen benutzerdefinierten Collector verwenden, um Ihre Ziele zu erreichen Tor. Bitte finden Sie Details unten:

%Vor%

Es kann jedoch einige Probleme geben, wenn parallel stream verwendet wird.

    
Anton Balaniuc 16.01.2017 14:46
quelle
0

BEARBEITEN : Wie von @Bolzano kommentiert, erfüllt dieser Ansatz nicht die Anforderung.

Wenn t der Eingabestream ist, dann

%Vor%

erzeugt einen Stream von eindeutigen Elementen ohne Erstellen einer Liste.

Dann eine einfache

%Vor%

kann eine Liste mit eindeutigen Elementen erstellen.

Ich verstehe nicht, warum so langwierige Lösungen wie @CKing und @Anton benötigt werden? Fehle ich etwas?

    
Serg M Ten 18.01.2017 14:04
quelle
-1

Bitte versuchen Sie diese Lösung:

%Vor%

}

Ausgabe: [1, 2, 3, 4, 1]

Lösung ohne Karte:

%Vor%

}

    
Rohit Gulati 16.01.2017 14:31
quelle

Tags und Links