Więc jeśli mam dwa zestawy:
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);
Czy jest sposób na ich porównanie i zwrócono tylko zestaw 4 i 5?
test1
zawarta6
, czy odpowiedź byłaby 4,5,6? czyli czy chcesz symetrycznej różnicy en.wikipedia.org/wiki/Symmetric_differenceOdpowiedzi:
Spróbuj tego
Ustaw # removeAll
źródło
Set
kiedy nie definiujeunion
,intersection
lubdifference
!!!test1.removeAll(test2);
zwróci ten sam wynik cotest2.removeAll(test1);
?test1.removeAll(test2)
jest pustym zestawem.test2.removeAll(test1)
jest{4, 5}
.Jeśli korzystasz z biblioteki Guava (dawne Kolekcje Google), jest rozwiązanie:
Zwracany
SetView
jest aSet
, jest to reprezentacja na żywo, którą można uczynić niezmienną lub skopiować do innego zestawu.test1
itest2
pozostają nienaruszone.źródło
symmetricDifference()
przyniesie wszystko oprócz skrzyżowania, nie o to chodziło w pierwotnym pytaniu.Tak:
Chociaż spowoduje to mutację
test2
, więc utwórz kopię, jeśli chcesz ją zachować.Prawdopodobnie miałeś na myśli
<Integer>
zamiast<int>
.źródło
Java 8
Możemy skorzystać z removeIf, która przyjmuje predykat do napisania metody narzędziowej jako:
A jeśli nadal jesteśmy na jakiejś wcześniejszej wersji, możemy użyć removeAll jako:
źródło
Jeśli używasz Java 8, możesz spróbować czegoś takiego:
źródło
Set
jest większa ... Dlatego jeśli spróbujesz odjąć a mniejszySet
od większegoSet
, otrzymasz inne wyniki.public static <T> Set<T> difference(final Set<T> set1, final Set<T> set2) {
jako sygnatury, metoda jest wtedy użyteczna jako ogólna funkcja narzędzia.Comparator<T>
aby móc dostosować porównanie, ponieważequals
nie zawsze jest wystarczające.Możesz użyć,
CollectionUtils.disjunction
aby uzyskać wszystkie różnice lubCollectionUtils.subtract
uzyskać różnicę w pierwszej kolekcji.Oto przykład, jak to zrobić:
źródło
CollectionUtils
pochodzi? Czy muszę zakładać, że pochodzi z Apache Commons Collection?Wystarczy podać jeden przykład (system jest w
existingState
, a my chcemy znaleźć elementy do usunięcia (elementy, których nie ma,newState
ale w których są obecneexistingState
) i elementy do dodania (elementy, które są wnewState
środku, ale nie są obecneexistingState
):wyświetli to jako wynik:
źródło