Удалить элемент о HashSet внутри для

Я хочу через HashSet с for (MyClass edg : myHashSet) и внутри forЯ хочу удалить элемент для моего HashSet.

for (MyClass edg : myHashSet)
{
    if(....)
         myHashSet.remove();
}

но есть ошибка java.util.ConcurrentModificationException Как я могу удалить элемент набора во время parcour?

3 ответа

Вместо использования модифицированного цикла for вы можете использовать Iterator. Итераторы имеют remove метод, который позволяет удалить последний элемент, возвращаемый Iterator.next(),

for (final java.util.Iterator<MyClass> itr = myHashSet.iterator(); itr.hasNext();) {
    final MyClass current = itr.next();
    if(....) {
        itr.remove();
    }
}

Прочитайте Javadoc:

Итераторы, возвращаемые методом итератора этого класса, не подвержены сбоям: если набор изменяется в любое время после создания итератора, любым способом, кроме как через собственный метод удаления итератора, итератор генерирует исключение ConcurrentModificationException.

Используйте Iterator и его метод remove().

MyClass edg
Iterator<MyClass> hashItr = myHashSet.iterator();
while ( hashItr.hasNext() ) {
    edge = hashItr.next();
    if ( . . . )
        hashItr.remove();
}

Я немного подумал, прошло некоторое время с тех пор, как я сделал java, но другой стандартный болотный способ сделать это заключается в следующем:

Set<Person> people = new HashSet<Person>(); 
Set<Person> peopleToRemove = new HashSet<Person>(); 

// fill the set of people here.
for (Person currentPerson : people) { 
    removalSet.add(currentPerson); 
} 

people.removeAll(peopleToRemove); 
Другие вопросы по тегам