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