Wenn ich also zwei Sets habe:
Set<int> test1 = new HashSet<Integer>();
test1.add(1);
test1.add(2);
test1.add(3);
Set<int> 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?
Versuche dies
test2.removeAll(test1);
Entfernt alle darin enthaltenen Elemente aus der Gruppe (optionaler Vorgang). Wenn die angegebene Auflistung auch eine Menge ist, ändert diese Operation diese Menge effektiv so, dass ihr Wert die asymmetrische Satzdifferenz der beiden Mengen ist.
Wenn Sie die Guava-Bibliothek (früher Google Collections) verwenden, gibt es eine Lösung:
SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1);
Die zurückgegebene SetView
ist eine Set
, es ist eine Live-Darstellung, die Sie entweder unveränderlich machen oder in ein anderes Set kopieren können. test1
und test2
bleiben erhalten.
Ja:
test2.removeAll(test1)
Obwohl dies test2
mutiert, sollten Sie eine Kopie erstellen, wenn Sie sie beibehalten möchten.
Sie meinten wahrscheinlich auch <Integer>
anstelle von <int>
.
Wenn Sie Java 8 verwenden, können Sie Folgendes versuchen:
public Set<Number> difference(final Set<Number> set1, final Set<Number> set2){
final Set<Number> larger = set1.size() > set2.size() ? set1 : set2;
final Set<Number> smaller = larger.equals(set1) ? set2 : set1;
return larger.stream().filter(n -> !smaller.contains(n)).collect(Collectors.toSet());
}
Wir können removeIf verwenden, um ein Hilfsmittel als Prädikat zu schreiben:
// computes the difference without modifying the sets
public static <T> Set<T> differenceJava8(final Set<T> setOne, final Set<T> setTwo) {
Set<T> result = new HashSet<T>(setOne);
result.removeIf(setTwo::contains);
return result;
}
Falls wir uns noch in einer früheren Version befinden, können Sie removeAll als verwenden:
public static <T> Set<T> difference(final Set<T> setOne, final Set<T> setTwo) {
Set<T> result = new HashSet<T>(setOne);
result.removeAll(setTwo);
return result;
}
Sie können CollectionUtils.disjunction
verwenden, um alle Unterschiede abzurufen, oder CollectionUtils.subtract
, um die Differenz in der ersten Sammlung zu ermitteln.
Hier ist ein Beispiel, wie das geht:
var collection1 = List.of(1, 2, 3, 4, 5);
var collection2 = List.of(2, 3, 5, 6);
System.out.println(StringUtils.join(collection1, " , "));
System.out.println(StringUtils.join(collection2, " , "));
System.out.println(StringUtils.join(CollectionUtils.subtract(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.retainAll(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.collate(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.disjunction(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.intersection(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.union(collection1, collection2), " , "));