我希望能够使用 for (MyClass edg : myHashSet)
遍历一个 HashSet,在 for
循环内部,我想要从 HashSet 中删除一个元素。
for (MyClass edg : myHashSet)
{
if(....)
myHashSet.remove();
}
但是出现了一个错误java.util.ConcurrentModificationException
,在遍历时如何删除集合(set)中的一个元素?
我希望能够使用 for (MyClass edg : myHashSet)
遍历一个 HashSet,在 for
循环内部,我想要从 HashSet 中删除一个元素。
for (MyClass edg : myHashSet)
{
if(....)
myHashSet.remove();
}
但是出现了一个错误java.util.ConcurrentModificationException
,在遍历时如何删除集合(set)中的一个元素?
除了使用修改后的for循环,你也可以使用迭代器。 迭代器有一个remove
方法,可以删除由Iterator.next()
返回的最后一个元素。
for (final java.util.Iterator<MyClass> itr = myHashSet.iterator(); itr.hasNext();) {
final MyClass current = itr.next();
if(....) {
itr.remove();
}
}
Iterator.remove()
会从您的HashSet中删除由Iterator.next()
返回的最后一个项目。 - Jack Edmonds阅读javadoc:
该类的iterator方法返回的迭代器是快速失败的:如果在创建迭代器后以任何方式修改集合,除非通过迭代器自己的remove方法,否则迭代器将抛出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);