java - 迭代列表直到列表为空

标签 java list loops iterator empty-list

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

  • 继续下一个元素(按某种逻辑)
  • 移除当前元素

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

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

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 以便再次迭代剩余的元素。

关于java - 迭代列表直到列表为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57715470/

相关文章:

java - neo4j - 使用 neo4j rest graph db 批量插入

java - 递归会使 java 或 java IDE 崩溃吗?

python - 循环遍历二维列表 python 不会正确更改值

c - 如何使用带有标准输入流的 fscanf 终止 while 循环

python - collat​​z 算法,当输入长度至少为 (n) 时返回第一个整数

javascript - 循环这个嵌套的 obj 构建器函数?

java - 在 Java 中的特定时间运行程序或方法

java - 可以将 Gson 实例用作模型 bean 中的静态字段(重用)吗?

python - 类型错误 : List indices must be integer must be integer, 不是元组

python - .clear() 对于列表不起作用 - python