simetrica - manejo de conjuntos en java
Diferencia simétrica de dos conjuntos en Java (6)
Hay dos TreeSet
s en mi aplicación:
set1 = {501,502,503,504}
set2 = {502,503,504,505}
Quiero obtener la diferencia simétrica de estos conjuntos para que mi salida sea el conjunto:
set = {501,505}
Aquellos que buscan una resta / complemento de set (no diferencia / disyunción simétrica) pueden usar CollectionUtils.subtract(a,b)
o Sets.difference(a,b)
.
Estás tras la diferencia simétrica . Esto se discute en el tutorial de Java .
Set<Type> symmetricDiff = new HashSet<Type>(set1);
symmetricDiff.addAll(set2);
// symmetricDiff now contains the union
Set<Type> tmp = new HashSet<Type>(set1);
tmp.retainAll(set2);
// tmp now contains the intersection
symmetricDiff.removeAll(tmp);
// union minus intersection equals symmetric-difference
Podrías usar CollectionUtils#disjunction
EDITAR:
Alternativamente, con menos pre-Java-5-ness, use Guava Sets#symmetricDifference
Puedes probar Sets.symmetricDifference()
de Eclipse Collections .
Set<Integer> set1 = new TreeSet<>(Arrays.asList(501,502,503,504));
Set<Integer> set2 = new TreeSet<>(Arrays.asList(502,503,504,505));
Set<Integer> symmetricDifference =
Sets.symmetricDifference(set1, set2);
Assert.assertEquals(
new TreeSet<>(Arrays.asList(501, 505)),
symmetricDifference);
Nota: Soy un comendador de Eclipse Collections.
use retener todo, elimine todo y luego agregue Todo para hacer una unión de un conjunto existente.
- intersectionSet.retainAll (set2) // intersectionSet es una copia de set1
- set1.addAll (set2); // hacer una unión de set1 y set2
- luego elimine los duplicados set1.removeAll (intersectionSet);
Set<String> s1 = new HashSet<String>();
Set<String> s2 = new HashSet<String>();
s1.add("a");
s1.add("b");
s2.add("b");
s2.add("c");
Set<String> s3 = new HashSet<String>(s1);
s1.removeAll(s2);
s2.removeAll(s3);
s1.addAll(s2);
System.out.println(s1);
salida de s1: [a, c]