web-dev-qa-db-fra.com

Différence symétrique de deux ensembles en Java

Il y a deux TreeSets dans mon application:

set1 = {501,502,503,504}
set2 = {502,503,504,505}

Je veux obtenir la différence symétrique de ces ensembles de sorte que ma sortie soit l'ensemble:

set = {501,505}
27
Abhij

Vous recherchez la différence symétrique . Ceci est discuté dans le tutoriel 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
23
Donal Fellows

Vous pouvez utiliser CollectionUtils#disjunction

MODIFIER:

Vous pouvez également utiliser Guava Sets # symmetricDifference avec moins de pré-Java-5-ness

11
beny23

Ceux qui recherchent set soustraction/complement (différence/disjonction non symétrique) peuvent utiliser CollectionUtils.subtract(a,b) ou Sets.difference(a,b) .

3
jameshfisher

utiliser conserver tout, supprimer tout puis ajouter tout pour faire une union d'un ensemble existant.

  1. intersectionSet.retainAll (set2) // intersectionSet est une copie de set1.
  2. set1.addAll (set2); // fait une union de set1 et set2
  3. puis supprimez les doublons set1.removeAll (intersectionSet);
1
digitebs
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);

sortie de s1: [a, c]

0
Chandra Sekhar

Vous pouvez essayer Sets.symmetricDifference() à partir 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);

Remarque: je suis un partisan des collections Eclipse.

0
Donald Raab