Eliminar elementos de una colección en java mientras se itera sobre ella

Quiero poder eliminar varios elementos de un conjunto mientras estoy iterando sobre él. Inicialmente, esperaba que los iteradores fueran lo suficientemente inteligentes como para que la solución ingenua que se muestra a continuación funcionara.

Set<SomeClass> set = new HashSet<SomeClass>();
fillSet(set);
Iterator<SomeClass> it = set.iterator();
while (it.hasNext()) {
    set.removeAll(setOfElementsToRemove(it.next()));
}

Pero esto arroja unConcurrentModificationException.

Tenga en cuenta que iterator.remove () no funcionará tan lejos como puedo ver porque necesito eliminar varias cosas a la vez. También asuma que no es posible identificar qué elementos eliminar "sobre la marcha", pero es posible escribir el métodosetOfElementsToRemove(). En mi caso específico, tomaría una gran cantidad de memoria y tiempo de procesamiento para determinar qué eliminar al iterar. Hacer copias tampoco es posible debido a limitaciones de memoria.

setOfElementsToRemove() generará algún conjunto de instancias de SomeClass que deseo eliminar, yfillSet(set) llenará el conjunto con las entradas.

Después de buscar Stack Overflow, no pude encontrar una buena solución a este problema, pero unas horas más tarde, 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 que se le pasa. Necesitamos eliminar el valor pasado para queset se vaciará

Mi pregunta es si alguien tiene una mejor forma de hacerlo o si hay operaciones de recolección que apoyen 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.

Respuestas a la pregunta(9)

Su respuesta a la pregunta