java - simetrica - Obteniendo la diferencia entre dos conjuntos
operaciones entre conjuntos union (4)
Prueba esto
test2.removeAll(test1);
Elimina de este conjunto todos sus elementos que están contenidos en la colección especificada (operación opcional). Si la colección especificada también es un conjunto, esta operación modifica efectivamente este conjunto de modo que su valor sea la diferencia del conjunto asimétrico de los dos conjuntos.
Entonces, si tengo dos juegos:
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);
¿Hay alguna forma de compararlos y solo se devuelve un conjunto de 4 y 5?
Sí:
test2.removeAll(test1)
Aunque esto mutará la test2
, entonces crea una copia si necesitas preservarla.
Además, probablemente significó <Integer>
lugar de <int>
.
Si está utilizando Java 8, podría intentar algo como esto:
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());
}
Si usa la biblioteca de Guava (antigua colección de Google), hay una solución:
SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1);
El SetView
devuelto es un Set
, es una representación en vivo que puede hacer inmutable o copiar a otro conjunto. test1
y test2
se dejan intactos.