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?

test1contenido6, ¿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
Setcuando no se defineunion,intersectionodifference!!!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
SetViewes unSet, es una representación en vivo que puede hacer inmutable o copiar a otro conjunto.test1ytest2se 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
Setes más grande ... Por lo tanto, si estás tratando de restar aa más pequeñoSetde 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 porqueequalsno siempre es suficiente.Puede usar
CollectionUtils.disjunctionpara obtener todas las diferencias oCollectionUtils.subtractpara obtener la diferencia en la primera colección.Aquí hay un ejemplo de cómo hacerlo:
fuente
CollectionUtilsproviene? ¿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 nonewStateestán pero están presentesexistingState) y elementos para agregar (elementos que están dentronewStatepero no están presentesexistingState):daría como resultado esto:
fuente