迭代列表直到列表为空
Iterating a list until the list is empty
我正在尝试迭代一个列表,其中每次迭代我都在执行以下操作之一:
- 继续下一个元素(根据某种逻辑)
- 正在删除当前元素
我需要的是,在我遍历所有项目之后,它会继续迭代,直到列表为空(逻辑确保所有元素都将被删除)。
问题是迭代器迭代完所有列表元素后,没有在我没有移除的元素上继续运行:
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()
将始终 return 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
以便再次迭代其余元素。
我正在尝试迭代一个列表,其中每次迭代我都在执行以下操作之一:
- 继续下一个元素(根据某种逻辑)
- 正在删除当前元素
我需要的是,在我遍历所有项目之后,它会继续迭代,直到列表为空(逻辑确保所有元素都将被删除)。
问题是迭代器迭代完所有列表元素后,没有在我没有移除的元素上继续运行:
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()
将始终 return 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
以便再次迭代其余元素。