Usuwanie elementów z kolekcji w Javie podczas iteracji nad nią

Chcę móc usuwać wiele elementów z zestawu podczas iteracji nad nim. Początkowo miałem nadzieję, że iteratory będą wystarczająco inteligentne, aby naiwne rozwiązanie działało poniżej.

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

Ale to rzucaConcurrentModificationException.

Zauważ, że iterator.remove () nie będzie działać tak daleko, jak widzę, ponieważ muszę usuwać wiele rzeczy naraz. Załóżmy również, że nie można określić, które elementy usunąć „w locie”, ale można napisać metodęsetOfElementsToRemove(). W moim konkretnym przypadku zajmowałoby to dużo pamięci i czasu przetwarzania, aby określić, co usunąć podczas iteracji. Wykonywanie kopii również nie jest możliwe z powodu ograniczeń pamięci.

setOfElementsToRemove() wygeneruje zestaw instancji SomeClass, które chcę usunąć, ifillSet(set) wypełni zestaw wpisami.

Po przeszukiwaniu przepełnienia stosu nie mogłem znaleźć dobrego rozwiązania tego problemu, ale po kilku godzinach przerwy zdałem sobie sprawę, że poniższe zadanie zadziała.

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() wygeneruje zestaw elementów do usunięcia, w tym wartość przekazaną do niego. Musimy usunąć przekazaną wartość takset będzie pusty.

Moje pytanie brzmi, czy ktoś ma lepszy sposób na to, czy też istnieją operacje windykacyjne, które wspierają tego rodzaju przeprowadzki.

Pomyślałem też, że opublikuję moje rozwiązanie, ponieważ wydaje się, że istnieje taka potrzeba i chciałem udostępnić doskonały zasób, jakim jest przepełnienie stosu.

questionAnswers(9)

yourAnswerToTheQuestion