Entonces, si tengo dos 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);
¿Hay alguna manera de compararlos y solo devolver un conjunto de 4 y 5?
test1
contenido6
, ¿la respuesta sería 4,5,6? es decir, ¿quieres la diferencia simétrica en.wikipedia.org/wiki/Symmetric_differenceRespuestas:
Prueba esto
Establecer # removeAll
fuente
Set
cuando no se defineunion
,intersection
odifference
!!!test1.removeAll(test2);
el mismo resultado quetest2.removeAll(test1);
?test1.removeAll(test2)
Es un conjunto vacío.test2.removeAll(test1)
es{4, 5}
.Si usa la biblioteca Guava (anteriormente Google Collections), hay una solución:
El resultado
SetView
es unSet
, es una representación en vivo que puede hacer inmutable o copiar a otro conjunto.test1
ytest2
se dejan intactos.fuente
symmetricDifference()
traerá todo menos la intersección, eso no es lo que pidió la pregunta original.Si:
Aunque esto va a mutar
test2
, cree una copia si necesita preservarla.Además, probablemente quisiste decir en
<Integer>
lugar de<int>
.fuente
Java 8
Podemos hacer uso de removeIf que toma un predicado para escribir un método de utilidad como:
Y en caso de que todavía estemos en alguna versión anterior, podemos usar removeAll como:
fuente
Si está utilizando Java 8, puede intentar algo como esto:
fuente
Set
es más grande ... Por lo tanto, si estás tratando de restar aa más pequeñoSet
de uno más grandeSet
, recibirás resultados diferentes.public static <T> Set<T> difference(final Set<T> set1, final Set<T> set2) {
como firma, el método se puede usar como función de utilidad genérica.Comparator<T>
para poder personalizar la comparación porqueequals
no siempre es suficiente.Puede usar
CollectionUtils.disjunction
para obtener todas las diferencias oCollectionUtils.subtract
para obtener la diferencia en la primera colección.Aquí hay un ejemplo de cómo hacerlo:
fuente
CollectionUtils
proviene? ¿Tengo que asumir que es de la Colección Apache Commons?Solo para poner un ejemplo aquí (el sistema está en
existingState
, y queremos encontrar elementos para eliminar (elementos que nonewState
están pero están presentesexistingState
) y elementos para agregar (elementos que están dentronewState
pero no están presentesexistingState
):daría como resultado esto:
fuente