2010-09-28 79 views
8

我想迭代一個Set並從集合中刪除匹配某些條件的元素。 documentation of iterator在迭代時沒有提及修改列表。Java設置迭代器,安全刪除元素?

這可能嗎?如果不是,那麼最好的辦法是什麼?請注意,我只想從集合中提取Iterator提供的元素。

編輯:很快就顯示出這是可能的。我可以用下面的語法來做到嗎?

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

「我還可以用下面的語法來做到嗎?」。編號 – Thilo 2010-09-28 07:34:35

回答

16

是的,你可以使用迭代器安全地刪除當前元素:

iterator.remove(); 

的的remove()javadoc說:

移除此組指定的元素,如果它是目前(可選操作)。更正式地說,刪除一個元素e,使得(o == null?e == null:o.equals(e)),如果這個集合包含這樣一個元素。如果該集合包含該元素(或者等同於該集合因該調用而更改),則返回true。 (這組將不包含一旦調用返回的元素。)


回答你的下一個問題:不,你不能。使用增強型for循環對其進行修改時,將導致ConcurrentModificationException

+1

這是迭代時修改集合的唯一方法。其他任何事情都會給你一個ConcurrentModificationException。 – Thilo 2010-09-28 07:33:40

+0

謝謝!!!!!!!!! – 2010-09-28 07:33:54

1

tangens的答案是正確的。如果你不使用iterator.remove(),而是直接從集中刪除,您會收到一個異常調用ConcurrentModificationException

-1

(節點n:mySet){ mySet.remove(n); }

由於您正在修改您正在迭代的設置,因此無法工作。然而,這隻能使用迭代器來完成,而這種情況並非如此。

這是使用增強for循環的一個缺點。

0

這在Java中8實際上已經提高現在你只需

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

以上是爲default方法java.util.Collection實施,應該從寫枯燥的循環節省大家。也就是說,它應該適用於任何類型的收集,而不僅僅是Set