为什么 list-iterator.next();回到 "no current element" 的位置,除非重复多次直到结束?
Why does list-iterator.next(); goes back to "no current element" position unless it is iterated multiple times till end?
根据 Java 文档:
A ListIterator has no current element; its cursor position always lies
between the element that would be returned by a call to previous() and
the element that would be returned by a call to next(). An iterator
for a list of length n has n+1 possible cursor positions, as
illustrated by the carets (^) below:
我的问题是,例如,假设一个 while 循环正在运行并且在按下 2 时,我调用了一个方法
public void callNextElement(int choice, LinkedList<String> linkedList) {
ListIterator<String> listIterator = linkedList.listIterator();
if (choice == 2) {
if (listIterator.hasNext()){
listIterator.next();
System.out.println("We have: " + listIterator.next());
}
}
}
现在,这将打印第一个元素并返回到 while 循环以获取输入,现在再次按 2,我将获得列表的第一个 element/entry。如果我这样做了:
System.out.println("We have: " + listIterator.next());
System.out.println("We have: " + listIterator.next());
System.out.println("We have: " + listIterator.next());
System.out.println("We have: " + listIterator.next());
....
这将打印链表中的其他元素
所以我的问题是:
为什么我调用的方法中没有打印出第2个元素等等?
为什么它 只工作 如果 listiterator.next() 像我上面打印的那样连续调用?
如果 listiterator 实际上会存储下一个元素位置,这样即使 next()
调用(没有连续)它也会打印下一个元素,会发生什么情况?不是第一个。
编辑:
我觉得自己很蠢,但是 Java 的垃圾收集在我的方法调用中起作用了吗?如果是,那么为什么它每次都打印第一个元素是有道理的。我是 Java 的新手,完全忘记了这一点...
每个列表迭代器在列表中都有自己独立的位置。每次调用 listIterator()
时,都会得到一个从列表开头开始的 new 迭代器。
ListIterator<String> listIterator = linkedList.listIterator();
如果您想遍历连续的元素,您需要调用 listIterator()
一次并将迭代器保存在某处以便可以重复使用。
要回答您的问题,您需要了解 Iterator
记住它在 Collection
或 Iterable
中的位置,但只有 Iterator
的同一实例知道这一点位置(即调用了多少次 Iterator.next()
)
1) Why doesnt it print out the 2nd element and so on in the method i called?
ListIterator<String> listIterator = linkedList.listIterator();
在您方法的这一行中,您每次调用此方法时都会为列表创建一个 new Iterator
。新的 Iterator
将始终从列表的开头开始。这就是为什么你总是只能得到列表的第一个元素。
2)Why does it only works if listiterator.next() is called in a sucession ? like I did by printing them above.
如上所述,新的迭代器将始终从列表的第一个元素开始(或更准确地说之前)。通过调用 Iterator.next()
可以将迭代器移动到列表的下一个元素。如果您在 相同的 Iterator
上多次调用 next()
,您将遍历整个列表,直到 Iterator.hasNext()
returns false
.如果 Iterator.hasNext()
是 false
并且您继续调用 Iterator.next()
将抛出 NoSuchElementException
。
3) What happens if listiterator would actually store the next element position so that when even if next() called (without succession) it would print the next element ? Not the first one.
我认为上面已经回答了这个问题?!
您可以更改方法以接受 Iterator
本身作为参数,而不是像这样的列表:
public void callNextElement(int choice, ListIterator<String> listIterator) {
if (choice == 2) {
if (listIterator.hasNext()){
listIterator.next()
System.out.println("We have: " + listIterator.next());
}
}
}
这个方法会这样调用:
ListIterator<String> listIterator = linkedList.listIterator();
while (condition == true) {
callNextElement(choice, listIterator);
}
这样您将始终将 same Iterator
传递给 callNextElement 方法并连续推进此迭代器的位置。
不,这与垃圾收集完全无关。
根据 Java 文档:
A ListIterator has no current element; its cursor position always lies between the element that would be returned by a call to previous() and the element that would be returned by a call to next(). An iterator for a list of length n has n+1 possible cursor positions, as illustrated by the carets (^) below:
我的问题是,例如,假设一个 while 循环正在运行并且在按下 2 时,我调用了一个方法
public void callNextElement(int choice, LinkedList<String> linkedList) {
ListIterator<String> listIterator = linkedList.listIterator();
if (choice == 2) {
if (listIterator.hasNext()){
listIterator.next();
System.out.println("We have: " + listIterator.next());
}
}
}
现在,这将打印第一个元素并返回到 while 循环以获取输入,现在再次按 2,我将获得列表的第一个 element/entry。如果我这样做了:
System.out.println("We have: " + listIterator.next());
System.out.println("We have: " + listIterator.next());
System.out.println("We have: " + listIterator.next());
System.out.println("We have: " + listIterator.next());
....
这将打印链表中的其他元素
所以我的问题是:
为什么我调用的方法中没有打印出第2个元素等等?
为什么它 只工作 如果 listiterator.next() 像我上面打印的那样连续调用?
如果 listiterator 实际上会存储下一个元素位置,这样即使
next()
调用(没有连续)它也会打印下一个元素,会发生什么情况?不是第一个。
编辑:
我觉得自己很蠢,但是 Java 的垃圾收集在我的方法调用中起作用了吗?如果是,那么为什么它每次都打印第一个元素是有道理的。我是 Java 的新手,完全忘记了这一点...
每个列表迭代器在列表中都有自己独立的位置。每次调用 listIterator()
时,都会得到一个从列表开头开始的 new 迭代器。
ListIterator<String> listIterator = linkedList.listIterator();
如果您想遍历连续的元素,您需要调用 listIterator()
一次并将迭代器保存在某处以便可以重复使用。
要回答您的问题,您需要了解 Iterator
记住它在 Collection
或 Iterable
中的位置,但只有 Iterator
的同一实例知道这一点位置(即调用了多少次 Iterator.next()
)
1) Why doesnt it print out the 2nd element and so on in the method i called?
ListIterator<String> listIterator = linkedList.listIterator();
在您方法的这一行中,您每次调用此方法时都会为列表创建一个 new Iterator
。新的 Iterator
将始终从列表的开头开始。这就是为什么你总是只能得到列表的第一个元素。
2)Why does it only works if listiterator.next() is called in a sucession ? like I did by printing them above.
如上所述,新的迭代器将始终从列表的第一个元素开始(或更准确地说之前)。通过调用 Iterator.next()
可以将迭代器移动到列表的下一个元素。如果您在 相同的 Iterator
上多次调用 next()
,您将遍历整个列表,直到 Iterator.hasNext()
returns false
.如果 Iterator.hasNext()
是 false
并且您继续调用 Iterator.next()
将抛出 NoSuchElementException
。
3) What happens if listiterator would actually store the next element position so that when even if next() called (without succession) it would print the next element ? Not the first one.
我认为上面已经回答了这个问题?!
您可以更改方法以接受 Iterator
本身作为参数,而不是像这样的列表:
public void callNextElement(int choice, ListIterator<String> listIterator) {
if (choice == 2) {
if (listIterator.hasNext()){
listIterator.next()
System.out.println("We have: " + listIterator.next());
}
}
}
这个方法会这样调用:
ListIterator<String> listIterator = linkedList.listIterator();
while (condition == true) {
callNextElement(choice, listIterator);
}
这样您将始终将 same Iterator
传递给 callNextElement 方法并连续推进此迭代器的位置。
不,这与垃圾收集完全无关。