在for循环中删除HashSet中的元素

4

我希望能够使用 for (MyClass edg : myHashSet) 遍历一个 HashSet,在 for 循环内部,我想要从 HashSet 中删除一个元素。

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

但是出现了一个错误java.util.ConcurrentModificationException,在遍历时如何删除集合(set)中的一个元素?


Mehdi,如果有人回答了你的问题,接受他们的答案是一个好习惯,否则你会发现人们不再回答你的问题。 - krystan honour
3个回答

6

除了使用修改后的for循环,你也可以使用迭代器。 迭代器有一个remove方法,可以删除由Iterator.next()返回的最后一个元素。

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

但是当我从迭代器中删除一个元素时,它会自动在我的哈希集中被删除吗? - Mehdi
2
@user1149157 是的。调用Iterator.remove()会从您的HashSet中删除由Iterator.next()返回的最后一个项目。 - Jack Edmonds

2

阅读javadoc:

该类的iterator方法返回的迭代器是快速失败的:如果在创建迭代器后以任何方式修改集合,除非通过迭代器自己的remove方法,否则迭代器将抛出ConcurrentModificationException异常。

使用Iterator及其remove()方法。

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

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); 

另一种方法是使用Iterator.remove(),它避免了正常的ConcurrentModificationException,如上所示的示例 :) - krystan honour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接