Java Set迭代器,可以安全地删除元素吗?

时间:2010-09-28 07:29:55

标签: java iterator set

我想迭代一个Set并从集合中删除匹配某些条件的元素。 documentation of iterator没有说明在迭代时修改列表。

这可能吗?如果没有,最好的方法是什么?请注意,我只想删除迭代器提供的集合中的元素。

编辑:很快就证明这是可能的。我也可以使用以下语法吗?

for(Node n : mySet) {
    mySet.remove(n);
}

5 个答案:

答案 0 :(得分:16)

是的,您可以使用迭代器安全地删除当前元素:

iterator.remove();

remove()的{​​{3}}说:

  

如果存在,则从该集合中移除指定的元素(可选操作)。更正式地,如果此集合包含这样的元素,则删除元素e(o == null?e == null:o.equals(e))。如果此set包含元素,则返回true(或等效地,如果此set由于调用而更改)。 (一旦调用返回,该集合将不包含该元素。)


回答你的下一个问题:不,你不能。使用增强的for循环迭代修改集合将导致ConcurrentModificationException

答案 1 :(得分:1)

tangens的答案是正确的。如果您不使用iterator.remove()但直接从Set中删除,您将收到异常调用ConcurrentModificationException

答案 2 :(得分:1)

这在Java 8中实际上有所改进。现在你可以

mySet.removeIf(element -> someConditionMatches());

以上内容在default中以java.util.Collection方式实现,可以避免每个人编写无聊的循环。也就是说,它应该适用于任何类型的集合,而不仅仅是Set

答案 3 :(得分:0)

这就是.remove()的作用:

http://download.oracle.com/javase/6/docs/api/java/util/Iterator.html#remove%28%29

“从底层集合中删除迭代器返回的最后一个元素(可选操作)。每次调用next时,只能调用一次。如果在迭代时修改了底层集合,则不指定迭代器的行为。除了通过调用此方法以外的任何方式进行。“

答案 4 :(得分:-1)

  

for(Node n:mySet){       mySet.remove(N); }

因为您正在修改正在迭代的集合而无法工作。然而,这只能使用迭代器来完成,而这种情况并非如此。

这是使用增强型for循环的一个缺点。