ListIterator的previous()方法

时间:2015-10-07 14:23:38

标签: java listiterator

文档说:

  

前面的()

     

返回列表中的上一个元素并向后移动光标位置。

假设我有一个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,因为它返回前一个元素。为什么会这样?我该如何解决这个问题?。

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)

原因:

docs方法的表单next()

  

返回列表中的下一个元素并前进光标位置。可以重复调用此方法以遍历列表,或者与对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