LisIterator 有 add() 但不迭代新添加的元素
LisIterator has add() but doesn't iterate over new added elements
我正在使用 ListIterator 在列表中迭代,因为如果满足某些条件,我想在运行时添加一些元素。
但是添加到列表的新元素永远不会包含在迭代器中
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Example {
public static void main(String[] s)
{
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(5);
list.add(6);
ListIterator<Integer> listIterator = list.listIterator();
while(listIterator.hasNext())
{
int i = listIterator.next();
System.out.println("List Element: " + i + " | List size: " + list.size());
if(i==1)
{
//Adding '3' to list
listIterator.add(3);
System.out.println("Added Element: 3");
}
if(i==2)
{
//Adding '4' to list
listIterator.add(4);
System.out.println("Added Element: 4");
}
}
}
}
下面是输出
List Element: 1 | List size: 4
Added Element: 3
List Element: 2 | List size: 5
Added Element: 4
List Element: 5 | List size: 6
List Element: 6 | List size: 6
我需要使用当前 listIterator 中最近添加的元素,但无法使用。
是否有任何其他方法可以在同一迭代会话中迭代新元素?
当您在 ListIterator<T>
上调用 add
时,它将元素放置在 next()
返回的元素之前:
The new element is inserted before the implicit cursor: a subsequent call to next()
would be unaffected, and a subsequent call to previous()
would return the new element.
这个API设计背后的逻辑是光标是双向的。它没有指示你迭代它的方向,所以它的设计者需要决定两个方向中的哪一个,next()
或 previous()
,将包含新添加的元素,所以他们决定在 previous()
.
如果您希望光标遍历新添加的元素,请在插入后立即调用 previous()
。
我们可以使用for
循环进行迭代,同时向循环末尾添加元素
for (int i = 0; i < list.size(); i++) {
int element = list.get(i);
if(element == 1){
System.out.println(element);
list.add(3);
}
else if(element == 2){
System.out.println(element);
list.add(4);
}
else
System.out.println(element);
}
System.out.println(list);
输出:
1
2
5
6
3
4
[1, 2, 5, 6, 3, 4]
我正在使用 ListIterator 在列表中迭代,因为如果满足某些条件,我想在运行时添加一些元素。
但是添加到列表的新元素永远不会包含在迭代器中
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Example {
public static void main(String[] s)
{
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(5);
list.add(6);
ListIterator<Integer> listIterator = list.listIterator();
while(listIterator.hasNext())
{
int i = listIterator.next();
System.out.println("List Element: " + i + " | List size: " + list.size());
if(i==1)
{
//Adding '3' to list
listIterator.add(3);
System.out.println("Added Element: 3");
}
if(i==2)
{
//Adding '4' to list
listIterator.add(4);
System.out.println("Added Element: 4");
}
}
}
}
下面是输出
List Element: 1 | List size: 4
Added Element: 3
List Element: 2 | List size: 5
Added Element: 4
List Element: 5 | List size: 6
List Element: 6 | List size: 6
我需要使用当前 listIterator 中最近添加的元素,但无法使用。
是否有任何其他方法可以在同一迭代会话中迭代新元素?
当您在 ListIterator<T>
上调用 add
时,它将元素放置在 next()
返回的元素之前:
The new element is inserted before the implicit cursor: a subsequent call to
next()
would be unaffected, and a subsequent call toprevious()
would return the new element.
这个API设计背后的逻辑是光标是双向的。它没有指示你迭代它的方向,所以它的设计者需要决定两个方向中的哪一个,next()
或 previous()
,将包含新添加的元素,所以他们决定在 previous()
.
如果您希望光标遍历新添加的元素,请在插入后立即调用 previous()
。
我们可以使用for
循环进行迭代,同时向循环末尾添加元素
for (int i = 0; i < list.size(); i++) {
int element = list.get(i);
if(element == 1){
System.out.println(element);
list.add(3);
}
else if(element == 2){
System.out.println(element);
list.add(4);
}
else
System.out.println(element);
}
System.out.println(list);
输出:
1
2
5
6
3
4
[1, 2, 5, 6, 3, 4]