Also, wenn ich zwei Sätze habe:
Set<Integer> test1 = new HashSet<Integer>();
test1.add(1);
test1.add(2);
test1.add(3);
Set<Integer> test2 = new HashSet<Integer>();
test2.add(1);
test2.add(2);
test2.add(3);
test2.add(4);
test2.add(5);
Gibt es eine Möglichkeit, sie zu vergleichen und nur einen Satz von 4 und 5 zurückzugeben?
test1
enthalten6
, wäre die Antwort 4,5,6? dh möchten Sie den symmetrischen Unterschied en.wikipedia.org/wiki/Symmetric_differenceAntworten:
Versuche dies
Setze # removeAll
quelle
Set
als a zu bezeichnen, wenn sie nicht definiert istunion
,intersection
oderdifference
!!!test1.removeAll(test2);
das gleiche Ergebnis zurückgeben wietest2.removeAll(test1);
?test1.removeAll(test2)
ist eine leere Menge.test2.removeAll(test1)
ist{4, 5}
.Wenn Sie die Guava-Bibliothek (ehemals Google Collections) verwenden, gibt es eine Lösung:
Die Rückgabe
SetView
ist eineSet
Live-Darstellung, die Sie entweder unveränderlich machen oder in ein anderes Set kopieren können.test1
undtest2
bleiben intakt.quelle
symmetricDifference()
wird alle außer der Kreuzung bringen, das ist nicht das, was die ursprüngliche Frage gestellt hat.Ja:
Obwohl dies mutiert
test2
, erstellen Sie eine Kopie, wenn Sie sie beibehalten müssen.Außerdem meintest du wahrscheinlich
<Integer>
statt<int>
.quelle
Java 8
Wir können removeIf verwenden, das ein Prädikat verwendet, um eine Dienstprogrammmethode zu schreiben:
Und falls wir uns noch in einer früheren Version befinden, können wir removeAll wie folgt verwenden:
quelle
Wenn Sie Java 8 verwenden, können Sie Folgendes versuchen:
quelle
Set
größer sind ... Wenn Sie also versuchen, eine kleinereSet
von einer größeren zu subtrahierenSet
, erhalten Sie unterschiedliche Ergebnisse.public static <T> Set<T> difference(final Set<T> set1, final Set<T> set2) {
als Signatur verwenden, die Methode kann dann als generische Dienstprogrammfunktion verwendet werden.Comparator<T>
, um den Vergleich anpassen zu können, da diesequals
nicht immer ausreicht.Sie können verwenden
CollectionUtils.disjunction
, um alle Unterschiede oderCollectionUtils.subtract
den Unterschied in der ersten Sammlung zu erhalten.Hier ist ein Beispiel dafür:
quelle
CollectionUtils
das? Muss ich davon ausgehen, dass es aus der Apache Commons Collection stammt?existingState
Um nur ein Beispiel zu nennen (System ist in , und wir möchten Elemente zum Entfernen finden (Elemente, die nichtnewState
vorhanden sind, aber vorhanden sindexistingState
) und Elemente zum Hinzufügen (Elemente, die vorhanden sind,newState
aber nicht vorhanden sindexistingState
):würde dies als Ergebnis ausgeben:
quelle