Удалить элемент о HashSet внутри для - PullRequest
4 голосов
/ 03 февраля 2012

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

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

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

Ответы [ 3 ]

6 голосов
/ 03 февраля 2012

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

for (final java.util.Iterator<MyClass> itr = myHashSet.iterator(); itr.hasNext();) {
    final MyClass current = itr.next();
    if(....) {
        itr.remove();
    }
}
2 голосов
/ 03 февраля 2012

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

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

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

MyClass edg
Iterator<MyClass> hashItr = myHashSet.iterator();
while ( hashItr.hasNext() ) {
    edge = hashItr.next();
    if ( . . . )
        hashItr.remove();
}
0 голосов
/ 22 марта 2012

Немного подумал, некоторое время назад я занимался 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...