43 votes

Quelle est la meilleure façon d'obtenir la différence symétrique entre deux ensembles en java ?

Je me demande s'il existe un moyen rapide/propre d'obtenir la différence symétrique entre deux ensembles ?

J'ai :

Set<String> s1 = new HashSet<String>();
s1.add("a");
s1.add("b");
s1.add("c");

Set<String> s2 = new HashSet<String>();
s2.add("b");

J'ai besoin de quelque chose comme :

Set<String> diff = Something.diff(s1, s2);
// diff would contain ["a", "c"]

Juste pour clarifier, j'ai besoin de la différence symétrique.

4voto

Erick Robertson Points 12958

Passez en boucle un ensemble et comparez.

Il n'y a que O(n) pour boucler l'un des ensembles. Considérez ce code :

for (String key: oldSet) {
    if (newSet.contains(key))
        newSet.remove(key);
    else
        newSet.add(key);
}

Et le newSet ne contiendra plus que les entrées uniques des deux ensembles. C'est rapide, car vous n'avez qu'à boucler les éléments dans l'un des ensembles et vous n'avez pas besoin de créer des ensembles à moins que vous n'ayez explicitement besoin d'une copie.

1voto

Suraj Upreti Points 21
public class Practice {
    public static void main(String[] args) {
        Set<Integer> set1 = new HashSet<Integer>();
        Set<Integer> set2 = new HashSet<Integer>();
        set1.add(1);
        set1.add(4);
        set1.add(7);
        set1.add(9);

        set2.add(2);
        set2.add(4);
        set2.add(5);
        set2.add(6);
        set2.add(7);

        symmetricSetDifference(set1, set2);
    }

    public static void symmetricSetDifference(Set<Integer>set1, Set<Integer>set2){
        //creating a new set
        Set<Integer> newSet = new HashSet<Integer>(set1);
        newSet.removeAll(set2);
        set2.removeAll(set1);
        newSet.addAll(set2);
        System.out.println(newSet);
    }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X