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:
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.
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 ...).
IntStream#range(int startInclusive, int endExclusive)
Methode zum Konvertieren der IntStream.boxed()
in eine IntStream
mit eingerahmter Stream
s 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:
Was Sie tun können, ist
%Vor%Damit können Sie die Elemente zuordnen, bevor sie zur Liste hinzugefügt werden.
Tags und Links java java-8 dictionary java-stream