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);
Existe-t-il un moyen de les comparer et de ne renvoyer qu'un ensemble de 4 et 5?
test1
contenue6
, la réponse serait 4,5,6? ie voulez-vous la différence symétrique en.wikipedia.org/wiki/Symmetric_differenceRéponses:
Essaye ça
Définir # removeAll
la source
Set
quand elle ne définit pasunion
,intersection
oudifference
!!!test1.removeAll(test2);
le même résultat quetest2.removeAll(test1);
?test1.removeAll(test2)
est un ensemble vide.test2.removeAll(test1)
est{4, 5}
.Si vous utilisez la bibliothèque Guava (ancienne Google Collections), il existe une solution:
Le rendu
SetView
est aSet
, c'est une représentation en direct que vous pouvez soit rendre immuable, soit copier dans un autre ensemble.test1
ettest2
sont laissés intacts.la source
symmetricDifference()
apportera tout sauf l'intersection, ce n'est pas ce que la question initiale demandait.Oui:
Bien que cela mute
test2
, créez une copie si vous devez la conserver.En outre, vous vouliez probablement dire
<Integer>
au lieu de<int>
.la source
Java 8
Nous pouvons utiliser removeIf qui prend un prédicat pour écrire une méthode utilitaire comme:
Et au cas où nous en serions encore à une version antérieure, nous pouvons utiliser removeAll comme:
la source
Si vous utilisez Java 8, vous pouvez essayer quelque chose comme ceci:
la source
Set
est la plus grande ... Par conséquent, si vous essayez de soustraire aa plus petitSet
d'un plus grandSet
, vous obtiendrez des résultats différents.public static <T> Set<T> difference(final Set<T> set1, final Set<T> set2) {
comme signature, la méthode est alors utilisable comme fonction d'utilité générique.Comparator<T>
pour pouvoir personnaliser la comparaison car ceequals
n'est pas toujours suffisant.Vous pouvez utiliser
CollectionUtils.disjunction
pour obtenir toutes les différences ouCollectionUtils.subtract
pour obtenir la différence dans la première collection.Voici un exemple de comment procéder:
la source
CollectionUtils
vient-il? Dois-je supposer qu'il provient d'Apache Commons Collection?Juste pour mettre un exemple ici (le système est dedans
existingState
, et nous voulons trouver des éléments à supprimer (éléments qui ne sont pas dedansnewState
mais qui sont présents dansexistingState
) et des éléments à ajouter (éléments qui sont dedansnewState
mais ne sont pas présents dansexistingState
):produirait ceci comme résultat:
la source