wake-up-neo.net

Den Unterschied zwischen zwei Sätzen ermitteln

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?

114
David Tunnell

Versuche dies 

test2.removeAll(test1);

Set # removeAll

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.

145
Prabhaker

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.

93

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>.

13
arshajii

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());
}
3
Josh M

Java 8

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;
}
2
i_am_zero

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), " , "));
1
pwipo