Então, se eu tiver dois conjuntos:
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);
Existe uma maneira de compará-los e retornar apenas um conjunto de 4 e 5?
test1
contida6
, a resposta seria 4,5,6? ou seja, você quer a diferença simétrica pt.wikipedia.org/wiki/Symmetric_differenceRespostas:
Tente isto
Definir # removeAll
fonte
Set
quando não defineunion
,intersection
oudifference
!!!test1.removeAll(test2);
devolver o mesmo resultado quetest2.removeAll(test1);
?test1.removeAll(test2)
é um conjunto vazio.test2.removeAll(test1)
é{4, 5}
.Se você usa a biblioteca Guava (ex-coleções do Google), existe uma solução:
O retorno
SetView
é aSet
, é uma representação ao vivo que você pode tornar imutável ou copiar para outro conjunto.test1
etest2
são deixados intactos.fonte
symmetricDifference()
trará tudo, menos a interseção, não é isso que a pergunta original pediu.Sim:
Embora isso mude
test2
, crie uma cópia se precisar preservá-la.Além disso, você provavelmente quis dizer em
<Integer>
vez de<int>
.fonte
Java 8
Podemos usar removeIf, que requer um predicado para escrever um método utilitário como:
E caso ainda estamos em uma versão anterior, podemos usar removeAll como:
fonte
Se você estiver usando o Java 8, pode tentar algo como isto:
fonte
Set
é maior ... Portanto, se você está tentando subtrair um menorSet
de um maiorSet
, receberá resultados diferentes.public static <T> Set<T> difference(final Set<T> set1, final Set<T> set2) {
como assinatura; o método é utilizável como função de utilitário genérica.Comparator<T>
para poder personalizar a comparação, porqueequals
nem sempre é suficiente.Você pode usar
CollectionUtils.disjunction
para obter todas as diferenças ouCollectionUtils.subtract
obter a diferença na primeira coleção.Aqui está um exemplo de como fazer isso:
fonte
CollectionUtils
vem? Preciso assumir que é da coleção Apache Commons?Apenas para colocar um exemplo aqui (o sistema está dentro
existingState
e queremos encontrar elementos para remover (elementos que nãonewState
estão mas estão presentesexistingState
) e elementos a serem adicionados (elementos que estão dentronewState
mas não estão presentesexistingState
):produziria isso como resultado:
fonte