Removendo itens de uma coleção em java enquanto iterar sobre ela

Eu quero ser capaz de remover vários elementos de um conjunto enquanto eu estou iterando sobre ele. Inicialmente, esperava que os iteradores fossem inteligentes o suficiente para que a solução ingênua abaixo funcionasse.

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

Mas isso lança umConcurrentModificationException.

Note que iterator.remove () não funcionará até onde eu possa ver, porque eu preciso remover várias coisas de cada vez. Suponha também que não é possível identificar quais elementos remover "on the fly", mas é possível escrever o métodosetOfElementsToRemove(). No meu caso específico, isso consumiria muita memória e tempo de processamento para determinar o que remover durante a iteração. Fazer cópias também não é possível devido a restrições de memória.

setOfElementsToRemove() irá gerar algum conjunto de instâncias SomeClass que eu quero remover, efillSet(set) irá preencher o conjunto com entradas.

Depois de pesquisar o Stack Overflow, não consegui encontrar uma boa solução para esse problema, mas depois de algumas horas, percebi que o seguinte faria o trabalho.

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() irá gerar um conjunto de elementos para remover que inclui o valor passado para ele. Precisamos remover o valor passado assimset vai esvaziar.

Minha pergunta é se alguém tem uma maneira melhor de fazer isso ou se há operações de coleta que suportem esse tipo de remoção.

Além disso, pensei em postar minha solução porque parece haver uma necessidade e queria contribuir com o excelente recurso que é o Stack Overflow.

questionAnswers(10)

yourAnswerToTheQuestion