文档说:
前面的()
返回列表中的上一个元素并向后移动光标位置。
假设我有一个ArrayList:[1,2,3,4,5]
最初光标指向此处:[1,2,3,4,5]
^
|
在这段代码之后
ListIterator li = al.listIterator();
while(li.hasNext()){
int ab = (int) li.next();
if(ab > 4)
break;
}
[1 2 3 4 5]
^
|
但是当我做的时候
System.out.println(li.previous());
它输出5
而不是输出4
,因为它返回前一个元素。为什么会这样?我该如何解决这个问题?。
答案 0 :(得分:1)
li.next()
刚刚返回5
(因为5 > 4
)
因此,li.previous()
会再次返回5
。
(对li.next()
的另一次调用会抛出NoSuchElementException
)
答案 1 :(得分:1)
您对索引所在的位置不正确。
首次初始化时,指针将在此处:
[1] [2] [3] [4] [5]
^
在您的代码之后,它将指向此处:
[1] [2] [3] [4] [5]
^
所以你的代码后面的前一个值实际上是5,正如你在测试时看到的那样。
答案 2 :(得分:1)
原因:
返回列表中的下一个元素并前进光标位置。可以重复调用此方法以遍历列表,或者与对previous()的调用混合以来回传递。 (请注意,对next和previous的交替调用将重复返回相同的元素。)
这就是为什么你得到5而不是4。
修复:
正如在文档中再次说的那样,为了获得所需的输出,你可以做的是,当条件满足时,向后退一步。
ListIterator li = al.listIterator();
while(li.hasNext()){
int ab = (int) li.next();
if (ab > 4){
li.previous();
break;
}
}
答案 3 :(得分:0)
在循环结束时,li.next()
会返回5
,会向前移动。因此,previous()
现在返回5
。此时,hasNext()
仍为false
,因此break
中的if
不是必需的,因为循环条件会自动评估为false
。