Je veux être en mesure de supprimer plusieurs éléments d'un ensemble pendant que j'effectue une itération sur celui-ci. Au départ, j'espérais que les itérateurs étaient suffisamment intelligents pour que la solution naïve ci-dessous fonctionne.
Set<SomeClass> set = new HashSet<SomeClass>();
fillSet(set);
Iterator<SomeClass> it = set.iterator();
while (it.hasNext()) {
set.removeAll(setOfElementsToRemove(it.next()));
}
Mais cela jette un ConcurrentModificationException
.
Notez que iterator.remove() ne fonctionnera pas, pour autant que je sache, car je dois supprimer plusieurs éléments à la fois. Supposons également qu'il n'est pas possible d'identifier les éléments à supprimer "à la volée", mais il est possible d'écrire la méthode setOfElementsToRemove()
. Dans mon cas spécifique, cela prendrait beaucoup de mémoire et de temps de traitement pour déterminer ce qu'il faut supprimer pendant l'itération. Faire des copies n'est pas non plus possible en raison des contraintes de mémoire.
setOfElementsToRemove()
va générer un ensemble d'instances de SomeClass que je veux supprimer, et fillSet(set)
remplira le plateau d'entrées.
Après avoir cherché sur Stack Overflow, je n'ai pas trouvé de bonne solution à ce problème, mais quelques heures de pause plus tard, j'ai réalisé que la solution suivante ferait l'affaire.
Set<SomeClass> set = new HashSet<SomeClass>();
Set<SomeClass> outputSet = new HashSet<SomeClass>();
fillSet(set);
while (!set.isEmpty()) {
Iterator<SomeClass> it = set.iterator();
SomeClass instance = it.next();
outputSet.add(instance);
set.removeAll(setOfElementsToRemoveIncludingThePassedValue(instance));
}
setOfElementsToRemoveIncludingThePassedValue()
générera un ensemble d'éléments à supprimer qui inclut la valeur qui lui est passée. Nous devons supprimer la valeur passée, donc set
se videra.
Ma question est de savoir si quelqu'un a une meilleure façon de procéder ou s'il existe des opérations de collecte qui permettent ce type d'enlèvement.
J'ai également pensé que je posterais ma solution car il semble y avoir un besoin et je voulais contribuer à l'excellente ressource qu'est Stack Overflow.