我想迭代一個Set並從集合中刪除匹配某些條件的元素。 documentation of iterator在迭代時沒有提及修改列表。Java設置迭代器,安全刪除元素?
這可能嗎?如果不是,那麼最好的辦法是什麼?請注意,我只想從集合中提取Iterator提供的元素。
編輯:很快就顯示出這是可能的。我可以用下面的語法來做到嗎?
for(Node n : mySet) {
mySet.remove(n);
}
我想迭代一個Set並從集合中刪除匹配某些條件的元素。 documentation of iterator在迭代時沒有提及修改列表。Java設置迭代器,安全刪除元素?
這可能嗎?如果不是,那麼最好的辦法是什麼?請注意,我只想從集合中提取Iterator提供的元素。
編輯:很快就顯示出這是可能的。我可以用下面的語法來做到嗎?
for(Node n : mySet) {
mySet.remove(n);
}
是的,你可以使用迭代器安全地刪除當前元素:
iterator.remove();
的的remove()
javadoc說:
移除此組指定的元素,如果它是目前(可選操作)。更正式地說,刪除一個元素e,使得(o == null?e == null:o.equals(e)),如果這個集合包含這樣一個元素。如果該集合包含該元素(或者等同於該集合因該調用而更改),則返回true。 (這組將不包含一旦調用返回的元素。)
回答你的下一個問題:不,你不能。使用增強型for循環對其進行修改時,將導致ConcurrentModificationException
。
這是迭代時修改集合的唯一方法。其他任何事情都會給你一個ConcurrentModificationException。 – Thilo 2010-09-28 07:33:40
謝謝!!!!!!!!! – 2010-09-28 07:33:54
tangens的答案是正確的。如果你不使用iterator.remove(),而是直接從集中刪除,您會收到一個異常調用ConcurrentModificationException
此北京時間什麼一個.remove()的作用:
http://download.oracle.com/javase/6/docs/api/java/util/Iterator.html#remove%28%29
從「刪除基礎集合是迭代器返回的最後一個元素(可選操作),這個方法只能在下一次調用時調用一次,如果底層集合被修改,而迭代以任何其他方式進行,迭代器的行爲是未指定的通過調用此方法「。
(節點n:mySet){ mySet.remove(n); }
由於您正在修改您正在迭代的設置,因此無法工作。然而,這隻能使用迭代器來完成,而這種情況並非如此。
這是使用增強for循環的一個缺點。
這在Java中8實際上已經提高現在你只需
mySet.removeIf(element -> someConditionMatches());
以上是爲default
方法java.util.Collection
實施,應該從寫枯燥的循環節省大家。也就是說,它應該適用於任何類型的收集,而不僅僅是Set
。
「我還可以用下面的語法來做到嗎?」。編號 – Thilo 2010-09-28 07:34:35