Durchlaufen und filtern von zwei Listen die mit java 8
Ich Durchlaufen zwei Listen und neue gefilterte Liste die Werte nicht in der zweiten Liste. Kann mir jemand helfen?
Ich habe zwei Listen - eine Liste von strings, und die andere ist die Liste der MyClass
Objekte.
List<String> list1;
List<MyClass> list2;
MyClass {
MyClass(String val)
{
this.str = val;
}
String str;
...
...
}
Möchte ich gefilterte Liste von strings, basierend auf -> check zweite Liste für Elemente (abc), deren Werte nicht im list1
.
List<String> list1 = Arrays.asList("abc", "xyz", "lmn");
List<MyClass> list2 = new ArrayList<MyClass>();
MyClass obj = new MyClass("abc");
list2.add(obj);
obj = new MyClass("xyz");
list2.add(obj);
Nun will ich neue gefilterte Liste -> welche Bedeutung haben => "lmn". d.h. Werte, die nicht in list2
dessen Elemente in list1
.
Möchten Sie Durchlaufen diese beiden Listen gleichzeitig ?
Herzlich willkommen auf Stackoverflow! Es ist gut, dass Sie einige code, sondern um eine Antwort, die Sie könnte auch versuchen zu beschreiben / zeigen, was Sie bisher ausprobiert haben.
Ja.. ich Durchlaufen beide Listen gleichzeitig. Zunächst ist Obermenge mit Liste von strings, und die zweite ist eine Liste von Objekten. Jedes Objekt in dieser zweiten Liste ist ein string-Feld mit dem ich vergleichen wollen ersten Listenelemente. Und alle diese fehlenden Elemente in der zweiten Liste, ich möchte, dass Sie erfassen in einer Liste.
Herzlich willkommen auf Stackoverflow! Es ist gut, dass Sie einige code, sondern um eine Antwort, die Sie könnte auch versuchen zu beschreiben / zeigen, was Sie bisher ausprobiert haben.
Ja.. ich Durchlaufen beide Listen gleichzeitig. Zunächst ist Obermenge mit Liste von strings, und die zweite ist eine Liste von Objekten. Jedes Objekt in dieser zweiten Liste ist ein string-Feld mit dem ich vergleichen wollen ersten Listenelemente. Und alle diese fehlenden Elemente in der zweiten Liste, ich möchte, dass Sie erfassen in einer Liste.
InformationsquelleAutor Arun Khot | 2015-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
ich änderte toMap zu toSet. Aber dennoch nicht wie erwartet funktioniert. nicht verfügbar ist nicht immer alle Elemente.
Sorry - das sollte toSet, nicht toMap - korrigiert in die post. Vielleicht ist die Logik, die Sie versuchen, zu implementieren, ist nicht ganz das, was ich vorgeschlagen habe. Ist die Idee, dass man auf der Suche nach Dingen, die in list1 und list2, oder versuchen Sie Dinge zu finden, die in list1 und NICHT in liste2? Wenn das zweite, dann setzen Sie ein ! in der filter - d.h.
.filter(e -> !unavailableItems.contains(e))
InformationsquelleAutor Ashley Frieze
Tun es mit streams ist einfach und gut lesbar:
InformationsquelleAutor DSchmidt
Schließlich bekam ich Weg, dies zu erreichen, folgenden Weg -
Aber dies ist auch wie erwartet funktioniert.
Bitte lassen Sie mich wissen, wie viel das effektiv ist? und wenn jemand andere Art und Weise zu tun, die gleiche Sache?
Nicht sieht die "richtige Antwort" markieren. Dies ist die gleiche Art mit Blasen! Es werden quadratische O der Zeit. Besser verwenden Sie Lösungen von stackoverflow.com/a/29534646/907576
InformationsquelleAutor Arun Khot
Wenn du Strom in der ersten Liste und verwenden Sie einen filter basierend auf enthalt in der zweiten...
Die nächste Frage ist, was code fügen Sie an das Ende dieser streaming-Betrieb zur Weiterverarbeitung der Ergebnisse... über Euch.
Auch, Liste.enthält, ist sehr langsam, so dass Sie besser wäre mit Gruppen.
Aber dann, wenn Sie mit sets, finden Sie vielleicht einige einfacher Operationen, um diese zu bewältigen, wie removeAll
Gegeben, wir wissen nicht, wie Sie gehen zu verwenden, ist es nicht wirklich möglich zu beraten, welche Vorgehensweise zu nehmen.
InformationsquelleAutor Ashley Frieze
Einem einfachen Ansatz wird eine foreach-in "list1" und überprüfen Sie, ob das Element in list2, wenn nicht hinzufügen list3.
Wenn Sie finden weiterhin label verwirrend, extrahieren Sie die innere Schleife in eine boolean-Rückkehr-Funktion. Sie können auch ersetzen die klassischen foreach-für lambda-stream-iterator.
aber es sieht wirklich mehr junky/verschmutzt und unnötig in meinen Augen.
Auch
String str
in Ihrer Klasse keinen öffentlichen definition, das ist, warum ich in beiden Beispielen verwendet "getStr ()" - Methode, vorausgesetzt, Ihre Klasse folgt auf das java-bean-Modell und enthält eine Methode getStr () - Methode.Pause und weiter zu beschriften und foreach sind vollkommen gültig ab Java 8. Sie können auch versuchen, einige gruselige Ansätze mit der Methode der Erklärung und stream-iteration, ich finde das alles auch zu kompliziert und zu verschwenden, aber ich werde aktualisieren Sie die Antwort.
wenn Sie mit
stream()
, nicht nurforeach()
. Ihre ersteforeach
sollteanyMatch
und der 2. solltecollect
.continue
mit labes ist einfach nur böse. Siehe meine Antwort.InformationsquelleAutor Felype
Siehe unten, würde es begrüßen, anyones feedback zu den untenstehenden code.
nicht üblich, zwischen zwei arrays:
Gemeinsame zwischen zwei arrays:
list2
nicht enthalten Zeichenfolgen.InformationsquelleAutor tosi
Diese können effizienter arbeiten.
InformationsquelleAutor YiFu.Zhou
wenn Sie die Klasse mit der id und nach dem Sie filtern möchten-id
line1 : Sie mape alle id -
line2: filter, was ist es nicht in der Karte
InformationsquelleAutor Ran Adler