220 votes

Obtenir la différence entre deux ensembles

Donc si j'ai deux ensembles :

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);

Y a-t-il un moyen de les comparer et de n'avoir qu'un jeu de 4 et 5 renvoyés ?

262voto

Prabhaker Points 4136

Essayez ceci

test2.removeAll(test1);

Set#removeAll

Supprime de cet ensemble tous ses éléments qui sont contenus dans la collection spécifiée (opération facultative). Si la collection spécifiée est également un ensemble, cette opération modifie effectivement cet ensemble de sorte que sa valeur soit la différence asymétrique des deux ensembles.

150voto

Mikhail Golubtsov Points 164

Si vous utilisez la bibliothèque Guava (anciennement Google Collections), il existe une solution :

SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1);

Le retour SetView est un Set Il s'agit d'une représentation vivante que vous pouvez soit rendre immuable, soit copier dans un autre ensemble. test1 y test2 sont laissés intacts.

19voto

arshajii Points 65653

Oui :

test2.removeAll(test1)

Même si cela va muter test2 Créez donc une copie si vous devez la conserver.

Aussi, vous avez probablement voulu dire <Integer> au lieu de <int> .

18voto

akhil_mittal Points 40

Java 8

Nous pouvons utiliser removeIf qui prend un prédicat pour écrire une méthode utilitaire comme :

// computes the difference without modifying the sets
public static <T> Set<T> differenceJava8(final Set<T> setOne, final Set<T> setTwo) {
     Set<T> result = new HashSet<T>(setOne);
     result.removeIf(setTwo::contains);
     return result;
}

Et si nous sommes toujours dans une version antérieure, nous pouvons utiliser removeAll :

public static <T> Set<T> difference(final Set<T> setOne, final Set<T> setTwo) {
     Set<T> result = new HashSet<T>(setOne);
     result.removeAll(setTwo);
     return result;
}

17voto

pwipo Points 65

Vous pouvez utiliser Apache Commons CollectionUtils.disjunction pour obtenir toutes les différences, ou CollectionUtils.subtract pour obtenir la différence dans la première collection.

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

Voici un exemple de la façon de procéder :

import org.apache.commons.collections4.CollectionUtils;
import java.util.List;

var collection1 = List.of(-1, 0, 1, 2, 3, 4, 5);
var collection2 = List.of(       1, 2, 3, 4, 5, 6, 7, 8, 9);

// [-1, 0, 1, 2, 3, 4, 5]
System.out.println(collection1);
// [1, 2, 3, 4, 5, 6, 7, 8, 9]
System.out.println(collection2);

// [-1, 0]
System.out.println(CollectionUtils.subtract(collection1, collection2));
// [6, 7, 8, 9]
System.out.println(CollectionUtils.subtract(collection2, collection1));

// [1, 2, 3, 4, 5]
System.out.println(CollectionUtils.retainAll(collection1, collection2));
// [1, 2, 3, 4, 5]
System.out.println(CollectionUtils.retainAll(collection2, collection1));

// [-1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9]
System.out.println(CollectionUtils.collate(collection1, collection2));
// [-1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9]
System.out.println(CollectionUtils.collate(collection2, collection1));

// [-1, 0, 6, 7, 8, 9]
System.out.println(CollectionUtils.disjunction(collection1, collection2));
// [-1, 0, 6, 7, 8, 9]
System.out.println(CollectionUtils.disjunction(collection2, collection1));

// [1, 2, 3, 4, 5]
System.out.println(CollectionUtils.intersection(collection1, collection2));
// [1, 2, 3, 4, 5]
System.out.println(CollectionUtils.intersection(collection2, collection1));

// [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
System.out.println(CollectionUtils.union(collection1, collection2));
// [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
System.out.println(CollectionUtils.union(collection2, collection1));

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