迭代列表,直到列表为空

时间:2019-08-29 17:47:53

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

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

1 个答案:

答案 0 :(得分:5)

您的解决方案似乎不正确。您将首先遍历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才能再次遍历其余元素。