Я хочу, чтобы удалить несколько элементов из набора, когда я повторяю его. Первоначально я надеялся, что итераторы были достаточно умны, чтобы наивное решение ниже работало.
Set<SomeClass> set = new HashSet<SomeClass>();
fillSet(set);
Iterator<SomeClass> it = set.iterator();
while (it.hasNext()) {
set.removeAll(setOfElementsToRemove(it.next()));
}
Но это вызывает a ConcurrentModificationException
.
Обратите внимание, что iterator.remove() не работает, насколько я могу видеть, потому что мне нужно одновременно удалить несколько вещей. Также предположим, что невозможно определить, какие элементы удалить "на лету", но можно написать метод setOfElementsToRemove()
. В моем конкретном случае для определения того, что нужно удалить во время итерации, потребуется много памяти и времени обработки. Создание копий также невозможно из-за ограничений памяти.
setOfElementsToRemove()
создаст некоторый набор экземпляров SomeClass, которые я хочу удалить, и fillSet(set)
заполнит набор элементами.
После поиска Qaru я не смог найти хорошее решение этой проблемы, но через несколько часов я понял, что следующее будет выполнять эту работу.
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()
создаст набор элементов для удаления, который включает в себя переданное ему значение. Нам нужно удалить переданное значение, поэтому set
будет пустым.
Мой вопрос в том, есть ли у кого лучший способ сделать это или есть ли операции сбора, которые поддерживают этот вид абзацев.
Кроме того, я думал, что отправлю свое решение, потому что, похоже, есть необходимость, и я хотел внести отличный ресурс, который является переполнением стека.