有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我需要在ListIterator中调用两次previous(),以便进行“反向”迭代?

我们知道ListIterator的方法next()previous()允许我们在两个方向上遍历。所以我做了一个小程序来尝试

List<String> songs = new ArrayList<>();
   songs.add("song1");
   songs.add("song2");
   songs.add("song3");
   songs.add("song4");

    ListIterator<String> iterator = songs.listIterator();

    System.out.println(iterator.next());
    System.out.println(iterator.next());
    System.out.println(iterator.next());

    System.out.println(iterator.previous());
    System.out.println(iterator.previous());

我所期待的是:

song1
song2
song3
song2
song1

但我错了。实际结果如下:

song1
song2
song3
song3
song2

有人能告诉我这是怎么发生的吗?当我在song3的时候,光标不就是吗?所以当我在previous()的时候,它会在之前给我一首歌?我怎样才能以简单的方式最终理解这个概念


共 (1) 个答案

  1. # 1 楼答案

    看看ListIteratorjavadoc

                         Element(0)   Element(1)   Element(2)   ... Element(n-1)
    cursor positions:  ^            ^            ^            ^                  ^
    

    在迭代开始时,光标指向第一个元素之前的

    调用next()(1)检索光标位置后的第一个元素,并(2)将光标向前移动到检索到的元素后的点

    调用previous()(1)检索光标位置之前的第一个元素,并(2)将光标设置为指向检索到的元素之前


    让我们来看看第三行和第四行输出之间发生了什么问题

    第二行输出后迭代器的状态:

                        "song1"   "song2"   "song3"   "song4"
    cursor position:                      ^
    

    现在再次调用next()并输出"song3"。迭代器状态如下所示:

                        "song1"   "song2"   "song3"   "song4"
    cursor position:                                ^
    

    此时,您调用previous()"song3"再次打印。操作后的迭代器状态如下:

                        "song1"   "song2"   "song3"   "song4"
    cursor position:                      ^