我想迭代一个Set并从集合中删除匹配某些条件的元素。 documentation of iterator没有说明在迭代时修改列表。
这可能吗?如果没有,最好的方法是什么?请注意,我只想删除迭代器提供的集合中的元素。
编辑:很快就证明这是可能的。我也可以使用以下语法吗?
for(Node n : mySet) {
mySet.remove(n);
}
答案 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循环的一个缺点。