首页 > 解决方案 > 为什么我不能使用迭代器连续删除 2 个项目?

问题描述

我使用 anIterator来遍历项目列表。根据元素的值,我需要删除当前和以下项目。但是,当连续删除多个项目时,出现异常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,删除元素时会出错。你能解释一下这种行为吗?谢谢!

标签: javaiterator

解决方案


it.remove()在条件 #2 中第二次调用方法时会出现错误。原因在于 Java 迭代器的原理,需要将其视为它们的位置在元素之间。当您调用 methodnext()时,迭代器会跳转到下一个元素并返回对它刚刚传递的元素的引用。

Iterator接口方法- 删除上次调用返回的remove()元素。next()在许多情况下,这是有道理的——您需要先查看该项目,然后再决定是否需要删除它。但是如果你想删除位于某个位置的元素,你将不得不通过它。

对于您的案件,这Iterator似乎不是浏览列表的最佳方式。使用您拥有的列表和其中的循环将是您删除元素的逻辑更容易。但是,如果您仍然需要使用 Iterator,则需要将第二个条件修复如下:

       // condition #2
       if (elem != null && ...) {
           it.remove();
           if (it.hasNext()) {
               it.next();
               it.remove();
           }
       }

推荐阅读