Wie beurteilt man, ob eine Liste eine Untersequenz eines anderen mit java8-Stream ist?

8

Zum Beispiel habe ich eine lange Liste [1, 2, 3, ..., 10] und eine kurze [1, 3, 6] , dann kann ich sagen, dass die kurze die Unterfolge einer anderen ist. Auf der anderen Seite ist die Liste [1 6 3] nicht, weil sie gegen die Reihenfolge Constraint.

Unten ist mein Java7-Stil-Code für diese Frage:

%Vor%

Und mein Wunsch ist es, einen java8 stream Stil zu finden, um das gleiche Ergebnis zu erzielen.

    
Run 17.02.2017, 08:23
quelle

5 Antworten

6

Wirkliche funktionelle Lösungen, d. h. die keinen veränderlichen Zustand enthalten, sind schwer zu finden. Dies wird am besten durch die Tatsache illustriert, dass alle Antworten bisher einen veränderlichen Zustand enthalten.

Außerdem gibt es keine Operation List.indexOf(T object, int startIndex) . Um zu veranschaulichen, wie nützlich es wäre, lass es über die Hilfsmethode definieren:

%Vor%

Es wäre leicht, eine alternative Implementierung ohne ein temporäres Objekt zu finden, wenn das ein Problem ist

Eine einfache Lösung mit veränderbarem Zustand wäre nun:

%Vor%

Eine funktionale Lösung ohne veränderlichen Zustand erfordert einen Werttyp, der zwei Positionen innerhalb der zwei Listen enthält. Wenn wir ein Array int[2] dafür verwenden, wäre die Lösung:

%Vor%     
Holger 17.02.2017 10:28
quelle
4

Ich bin der Fragesteller und beantworte meine Frage zuerst nur für die Marke:

%Vor%

Es funktioniert gut für die Sequenzliste [1, 3, 6], während für die Sequenz [1, 6, 3] ein Fehler java.util.NoSuchElementException ausgelöst wird. Das ist nicht das, was ich endlich erreichen möchte.

    
Run 17.02.2017 08:27
quelle
2

Ich denke, dass Sie der Lösung sehr nahe gekommen sind (ich habe nicht einmal an so ein Iterator gedacht, also ein Plus an Sie). Das Problem ist, dass Stream.generate ein unendlicher Stream ist.

Ich habe deinen Code nur ein wenig geändert.

%Vor%     
Eugene 17.02.2017 09:15
quelle
2

Eine Variante der @ Eugene-Variante von @ Runs Antwort würde beinhalten, Iterable :: spliterator auf der globalen Liste aufzurufen & lt; & gt; Wert, dann wenden Sie das Ergebnis auf StreamSupport :: stream:

%Vor%     
srborlongan 17.02.2017 09:37
quelle
0

Ich werde eine weitere Option hinzufügen, nachdem ich Holgers Antwort gesehen habe; aber das funktioniert nur mit jdk-9 Stream.iterate .

Ich habe eine Hilfsmethode auf die gleiche Weise definiert, ein kleines bisschen anders:

%Vor%

Und dann benutze einfach ein int[2] :

%Vor%

BEARBEITEN Holger hat recht, das wird nur für Nichtduplikate funktionieren.

Ich kann es auch für Duplikate schreiben, aber es leidet unter dem Punkt, dass fits jetzt zweimal aufgerufen werden muss.

%Vor%     
Eugene 19.02.2017 22:13
quelle