java - 为什么我不能使用迭代器连续删除 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,删除元素时会出错。你能解释一下这种行为吗?谢谢!
解决方案
it.remove()
在条件 #2 中第二次调用方法时会出现错误。原因在于 Java 迭代器的原理,需要将其视为它们的位置在元素之间。当您调用 methodnext()
时,迭代器会跳转到下一个元素并返回对它刚刚传递的元素的引用。
Iterator
接口方法- 删除上次调用返回的remove()
元素。next()
在许多情况下,这是有道理的——您需要先查看该项目,然后再决定是否需要删除它。但是如果你想删除位于某个位置的元素,你将不得不通过它。
对于您的案件,这Iterator
似乎不是浏览列表的最佳方式。使用您拥有的列表和其中的循环将是您删除元素的逻辑更容易。但是,如果您仍然需要使用 Iterator,则需要将第二个条件修复如下:
// condition #2
if (elem != null && ...) {
it.remove();
if (it.hasNext()) {
it.next();
it.remove();
}
}
推荐阅读
- angular - 如何在 Angular2 中使用 TinyMCE
- javascript - 在 Material-UI Accordion 中添加表格行数据
- python - 使用 Python 在日期末尾添加一年
- python - 使用 Python 检查字符串值是否包含数字
- docker - k3s pod 没有安装在 helm 部署的 imagePullSecrets 中定义的秘密
- javascript - 表单验证的错误消息未出现
- c++ - 为什么在 C++ 中的 dllimport 之前使用 typedef?
- java - android:如何以编程方式获取整个屏幕的屏幕截图
- mysql - 使用日期作为返回空白行的参数的 SQL 存储过程?
- fork - "gnome-terminal --" 退出并终止所有分叉