我希望通过一个包含for (MyClass edg : myHashSet)
和for
内部的HashSet,我想删除一个HashSet元素。
for (MyClass edg : myHashSet)
{
if(....)
myHashSet.remove();
}
但是有一个错误java.util.ConcurrentModificationException
如何在parcour中删除一个元素?
答案 0 :(得分:6)
您可以使用Iterator,而不是使用修改后的for循环。迭代器有一个remove
方法,可以删除Iterator.next()
返回的最后一个元素。
for (final java.util.Iterator<MyClass> itr = myHashSet.iterator(); itr.hasNext();) {
final MyClass current = itr.next();
if(....) {
itr.remove();
}
}
答案 1 :(得分:2)
阅读javadoc:
此类的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间修改了set,除了通过迭代器自己的remove方法之外,Iterator都会抛出ConcurrentModificationException。
使用Iterator及其remove()方法。
MyClass edg
Iterator<MyClass> hashItr = myHashSet.iterator();
while ( hashItr.hasNext() ) {
edge = hashItr.next();
if ( . . . )
hashItr.remove();
}
答案 2 :(得分:0)
有一点想法,自从我做了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);