Quiero ser capaz de eliminar varios elementos de un conjunto mientras estoy iterando sobre él. Inicialmente esperaba que los iteradores fueran lo suficientemente inteligentes como para que la siguiente solución ingenua funcione.Eliminar elementos de una colección en java mientras se itera sobre él
Set<SomeClass> set = new HashSet<SomeClass>();
fillSet(set);
Iterator<SomeClass> it = set.iterator();
while (it.hasNext()) {
set.removeAll(setOfElementsToRemove(it.next()));
}
Pero esto arroja un ConcurrentModificationException
.
Tenga en cuenta que iterator.remove() no funcionará tan lejos como puedo ver porque necesito eliminar varias cosas a la vez. Supongamos también que no es posible identificar qué elementos eliminar "sobre la marcha", pero es posible escribir el método setOfElementsToRemove()
. En mi caso específico, tomaría mucha memoria y tiempo de procesamiento para determinar qué eliminar mientras se iteraba. Hacer copias tampoco es posible debido a restricciones de memoria.
setOfElementsToRemove()
generará un conjunto de instancias SomeClass que deseo eliminar, y fillSet(set)
llenará el conjunto con las entradas.
Después de buscar Desbordamiento de pila No pude encontrar una buena solución a este problema, pero unas pocas horas después me di cuenta de que lo siguiente haría el trabajo.
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()
generará un conjunto de elementos para eliminar que incluye el valor pasado a ella. Necesitamos eliminar el valor pasado para que set
se vacíe.
Mi pregunta es si alguien tiene una mejor manera de hacerlo o si hay operaciones de recopilación que admiten este tipo de eliminaciones.
Además, pensé en publicar mi solución porque parece que hay una necesidad y quería contribuir con el excelente recurso que es Stack Overflow.
¿Cómo se usa "siguiente" para determinar qué elementos eliminar? Podría ayudar a proporcionar una mejor respuesta. – qnoid
Uno puede aprender muchas cosas de esta pregunta y las respuestas a continuación. – fastcodejava