2013-04-10 7 views
7

W Javie (może używając Guava?), jest jakiś sposób dostarczenia różnicy dwóch Collection s, np. List i Setbez modyfikację jednej z tych Collection s (inaczej nie byłoby collection1.removeAll(collection2)?Różnica między 2 kolekcjami? (elementy w kolekcji1, ale nie w kolekcji2)

W Guava jest Sets.difference(set1,set2), ale działa tylko na Set s, a nie dla dowolnych zbiorów.

Dzięki za ! wszelkie podpowiedzi

+5

Dlaczego nie po prostu skopiować elementy collection1' 'na' TestCollection 'i czy' testCollection.removeAll (collection2) '? – Xaerxess

+1

Oczywiście jest to jedno rozwiązanie, ale zastanawiam się, czy istnieje już pewna metoda dla mojego przypadku użycia, bez uprzedniego skopiowania kolekcji1? –

+0

@ stefan.at.wpf każde możliwe rozwiązanie będzie musiało wykonać kopię lub zmodyfikować dane wejściowe. Nie ma innej drogi. –

Odpowiedz

13

można filtrować pierwszy Collection pomocą wbudowanego Predicate s:

Collections2.filter(c1, Predicates.not(Predicates.in(c2)) 

Działa z każdym rodzajem Collection s, ale oczywiście lepiej jest, jeśli c2 jest Set.

3

Apache Commons CollectionUtils ma metodę nazwie disjuction że

Zwraca Zbiór zawierający ekskluzywną alternatywę (różnica symetryczna) danego Iterables

+0

Myślę, że [substract] (https://commons.apache.org/proper/commons- kolekcje/apidocs/org/apache/commons/collections4/CollectionUtils.html # subtract (java.lang.Iterable,% 20java.lang.Iterable)) to metoda odpowiednia tutaj. – Bax