为什么不能使用Iterator连续删除2个项目?

时间:2019-12-13 17:23:16

标签: java iterator

我使用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,则删除元素时出现错误。 您能解释一下这种行为吗?谢谢!

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();
}