Java 8, Stream von Integer, Gruppierung von Indizes eines Streams durch die Ganzzahlen?

8

Ich habe einen Stream von Ganzzahlen erhalten, und ich möchte die Indizes der Elemente nach dem Wert jedes Elements gruppieren.
Zum Beispiel wird {1, 1, 1, 2, 3, 3, 4} als Integer zur Liste der Indexzuordnungen gruppiert:

%Vor%

Ich habe versucht, Stream zu verwenden, aber mit einer zusätzlichen Klasse:

%Vor%

Ich muss Stream lesen, da der Stream von Integer aus einer Datei in meiner Anwendung gelesen wird.
Ich fühle, dass meine Art, es wie oben zu tun, ziemlich suboptimal ist. Gibt es einen besseren oder eleganteren Weg?
Danke für Ihre Hilfe.

    
Daniel 16.01.2015, 09:10
quelle

4 Antworten

4

Mit einer kleinen Hilfsmethode zum Sammeln:

%Vor%

die gesamte Operation wird:

%Vor%

Wenn Sie die Indizes, die vorher unbekannt sind, verfolgen müssen, benötigen Sie einen veränderlichen Zustand und daher die Operation "veränderliche Reduktion ".

Beachten Sie, dass Sie hier kein ConcurrentMap benötigen. Die Stream -Implementierung wird bereits die Parallelität behandeln. Es wird ein MapAndIndex -Container für jeden beteiligten Thread erstellt und die Operation merge für zwei Container aufgerufen, sobald beide verknüpften Threads mit ihrer Arbeit fertig sind. Dies wird auch in einer Art und Weise durchgeführt, die die Reihenfolge beibehält, wenn die Stream eine Ordnung hat, wie in diesem Beispiel (ansonsten macht die Aufnahme von Indizes keinen Sinn ...).

    
Holger 16.01.2015, 10:51
quelle
2
  1. Sie können die % co_de verwenden % Methode, um den Index jedes Elements zu erhalten.
  2. Verwenden Sie dann die IntStream#range(int startInclusive, int endExclusive) Methode zum Konvertieren der IntStream.boxed() in eine IntStream mit eingerahmter Stream s
  3. Gruppieren Sie, indem Sie jeden Index dem entsprechenden Element aus dem Array Integer zuordnen und die sich wiederholenden Elemente in einer Liste sammeln.

Zum Beispiel:

%Vor%

Aktualisieren : Wenn Sie das Array nicht haben (und daher die Elemente zählen), aber ein i -> array[i] , können Sie sammeln die Elemente des ursprünglichen Stream<Integer> in ein Stream sammeln. Auf diese Weise kennen Sie die Größe von List<Integer> und können dann Folgendes tun:

%Vor%     
Konstantin Yovkov 16.01.2015 09:51
quelle
1

Warum nicht:

%Vor%

Ergebnis:

%Vor%     
user2336315 16.01.2015 21:44
quelle
0

Was Sie tun können, ist

%Vor%

Damit können Sie die Elemente zuordnen, bevor sie zur Liste hinzugefügt werden.

    
Peter Lawrey 16.01.2015 18:04
quelle