迭代列表,直到列表为空



我正在尝试迭代一个列表,其中每次迭代我都在执行以下操作之一:

  • 继续下一个元素(通过某种逻辑(
  • 删除当前元素

我需要的是,在我遍历所有项目后,它将继续迭代,直到列表为空(逻辑确保所有元素都将被删除(。

问题是在迭代器迭代所有列表元素后,它没有继续在我没有删除的元素上运行:

List<Integer> lst = new ArrayList();
lst.add(1);
lst.add(2);
lst.add(3);
Iteartor<Integer> iterator = lst.listIterator();
while (iterator.hasNext()){
Integer curInt = iterator.next();
if (!passTest(curInt)){
continue;
}
iterator.remove();
}

重要说明:每次迭代passTest(curInt)逻辑可能不同。这意味着第一次迭代可能会导致continue,然后第二次和第三次迭代将导致删除。问题是我期待第四次迭代(在未删除的第一项上(。

我找到的解决方案:

List<Integer> lst = new ArrayList();
lst.add(1);
lst.add(2);
lst.add(3);
Iteartor<Integer> iterator = lst.listIterator();
while (!lst.isEmpty()){
Integer curInt;
if (iteration.hasNext()){
curInt = iterator.next();
} else {
curInt = lst.get(0);
}
if (!passTest(curInt)){
continue;
}
iterator.remove();
}

这是实现这一目标的正确方法吗?

您的解决方案似乎不正确。您将首先迭代List的所有元素,可能会删除其中的一些元素。一旦你完成了对List的迭代,iteration.hasNext()将始终返回false,所以你会继续得到第一个元素(由于curInt = lst.get(0)(。如果你删除第一个元素,下次执行curInt = lst.get(0)时会得到一个不同的元素,所以List最终会变成空,但这似乎不是所需的行为(如果这是所需的行为,你可以消除Iterator并继续在循环中获取第一个元素并可能删除它(。

您应该使用嵌套循环,并在外部循环中重新创建Iterator实例:

while (!lst.isEmpty()) {
Iteartor<Integer> iterator = lst.listIterator();
while (iterator.hasNext()) {
Integer curInt = iterator.next();
if (passTest(curInt)) {
iterator.remove();
}
}
}

外部循环的每次迭代都会创建一个Iterator并执行内部循环。

内循环的每次迭代都会遍历List的元素,并可能删除其中一些元素。

完成对List的迭代后,必须创建一个新Iterator才能再次循环访问其余元素。

相关内容

  • 没有找到相关文章

最新更新