我使用Iterator
遍历项目列表。根据元素的值,我需要删除当前和以下项目。
但是,当连续删除多个项目时,出现异常IllegalStateException
代码示例:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String elem = it.next();
if (elem != null && ...)
it.remove();
// condition #2
else if (elem != null && ...) {
it.remove();
if (it.hasNext())
it.remove();
}
}
如果满足条件2,则删除元素时出现错误。 您能解释一下这种行为吗?谢谢!
答案 0 :(得分:4)
第二次在条件#2中调用方法it.remove()
时出错。
原因在于Java迭代器的原理,需要将其视为位于元素之间。
当您调用方法next()
时,迭代器跳至下一个元素,并返回对其刚刚传递的元素的引用。
Iterator
接口方法remove()
-删除上一次next()
调用返回的元素。
在许多情况下,这是有道理的-您需要先查看该项目,然后再决定需要将其删除。 但是,如果要删除某个位置的元素,则必须进行遍历。
Iterator
似乎不是浏览案件清单的最佳方法。使用您拥有的列表和其中的循环将更容易,这将是删除元素的逻辑。
但是,如果仍然需要使用Iterator,则需要修复第二个条件,如下所示:
// condition #2
if (elem != null && ...) {
it.remove();
if (it.hasNext()) {
it.next();
it.remove();
}
}
答案 1 :(得分:3)
第一次调用remove
后,您需要先调用next
进入下一个条目,然后再将其删除(仅hasNext
是不够的)。所以:
it.remove();
if (it.hasNext()) {
it.next();
it.remove();
}