Удалить элемент о 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);