簡體   English   中英

從列表中動態刪除元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM