繁体   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