我编写了下面的程序来迭代列表,但是在备用遍历next() and previous()
上它重复了元素。我通过在我的打印逻辑之前放置一个指示符并将其用于extra next
和extra previous
来了解修复程序。但我想知道为什么行为是这样的,迭代器工作背后的算法是什么。
我已经检查了javaDoc,并在那里写了像
下一步
返回列表中的下一个元素。可以调用此方法 反复遍历列表,或混合调用 以前来回走动。 (注意交替拨打下一个 和之前将重复返回相同的元素。)
但问题是为什么?这样做的逻辑或目的是什么?
public class IterateLinkedListUsingListIterator {
public static void main(String[] args) throws NumberFormatException,
IOException {
LinkedList lList = new LinkedList();
lList.add("1");
lList.add("2");
lList.add("3");
lList.add("4");
lList.add("5");
ListIterator itr = lList.listIterator();
boolean ch = true;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (ch) {
System.out.println("Enter choice");
int chi = Integer.parseInt(br.readLine());
switch (chi) {
case 1:
if (itr.hasNext()) {
System.out.println(itr.next());
}
break;
case 2:
if (itr.hasPrevious()) {
System.out.println(itr.previous());
}
break;
default:
ch = false;
}
}
}
}
按照@vincrichaud的回答和 java doc 语句光标点之间的元素不在元素上,为什么会这样呢?是否有任何具体原因。
Element(0) Element(1) Element(2) ... Element(n-1)
cursor positions: ^ ^ ^ ^ ^
答案 0 :(得分:0)
正如doc
中所述下一步返回列表中的下一个元素并前进光标位置。
上一页返回列表中的上一个元素并向后移动光标位置。
不明显的是光标位置始终在元素之间而不在元素之间。它也在文档中描述。
ListIterator没有当前元素;它的光标位置总是位于元素
之间
知道这一点,很明显,当您拨打next()
和previous()
时,您将获得相同的元素。
LinkedList lList = new LinkedList();
lList.add("1");
lList.add("2");
lList.add("3");
lList.add("4");
lList.add("5");
//lList look like [1,2,3,4,5]
ListIterator itr = lList.listIterator(); //create iterator at position before element 0
itr.next() // return the next element => so return "1"
// And advance the cursor position => position between element 0 and element 1
itr.previous(); // return the previous element => so return "1"
// And step back the cursor position => position before element 0