[英]Dynamically removing elements from List
我在遍歷列表時刪除列表的元素時遇到問題。 碼:
For (WebElement element: list){
if (!element.isEnabled() || !element.isSelected()){
list.remove(element);
}
}
我得到了ConcurrentModificationException
,我完全理解。 我正在遍歷列表的循環中從列表中刪除項目。 直觀地講,這會破壞循環的索引。
我的問題是,我還應該如何從該列表中刪除未enabled
或未selected
元素?
從循環列表中刪除元素的最簡單方法是使用ListIterator
並使用例程iterator.remove()
刪除元素
以迭代器之外的方式在迭代列表時修改列表會導致未定義的行為。 您必須顯式使用迭代器:
Iterator<WebElement> iter = list.iterator();
while (iter.hasNext()) {
WebElement element = iter.next();
if (!element.isEnabled() || !element.isSelected()) {
iter.remove();
}
}
有關更多信息,請參見此問題 。
其他人建議使用列表迭代器。 事實證明,這對我很有用,但不幸的是,它依賴於方法remove()
,該方法在Iterable<E>
接口中被認為是可選的。
不再使用Javadoc(重點是我):
無效remove()
從基礎集合中移除迭代器返回的最后一個元素(可選操作) 。
要解決這個問題,對我來說更有用的是刪除列表。
List<E> removed = new ArrayList<E>();
for(E element : list) {
if(someCondition) removed.add(element);
}
list.removeAll(removed);
就像remove方法一樣,這樣做還有一個好處,即為您提供刪除內容的歷史記錄。
ConcurrentModificationException
來自以下事實的結果:for-each語法只是使用Iterator接口的語法糖。
列表迭代器具有所謂的“快速失敗”屬性,這意味着除迭代器提供的接口之外,對列表進行的任何更改都會立即使所述迭代器無效。 嘗試使用無效的迭代器會觸發您的異常。
@Claudiu已經發布了此代碼,但為清楚起見,我也將其放在此處。 為了做您想做的事情,您必須刪除花哨的語法並使用一個裸迭代器。
Iterator<WebElement iter = list.iterator();
while (iter.hasNext()) {
WebElement element = iter.next();
if (!element.isEnabled() || !element.isSelected()) {
iter.remove();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.