java - 为什么我需要在 ListIterator 中调用 previous() 两次才能进行 'reverse' 迭代?

标签 java iterator next

我们知道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()它给了我歌之前 那个?我怎样才能最终以简单的方式理解这个概念?

最佳答案

看看ListIteratorjavadoc ...

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

在迭代开始时,光标指向第一个元素之前。
调用 next() (1) 检索光标位置之后的第一个元素,(2) 使光标前进到检索到的元素之后。
调用 previous() (1) 检索光标位置之前的第一个元素,(2) 将光标设置为指向检索到的元素之前。

让我们检查一下有问题的输出的第 3 行和第 4 行之间发生了什么。
第二行输出后迭代器的状态:
                    "song1"   "song2"   "song3"   "song4"
cursor position:                      ^
现在您调用next()再次输出"song3" .您的迭代器状态如下所示:
                    "song1"   "song2"   "song3"   "song4"
cursor position:                                ^
此时您调用previous()"song3"再次打印。操作后的迭代器状态如下:
                    "song1"   "song2"   "song3"   "song4"
cursor position:                      ^

关于java - 为什么我需要在 ListIterator 中调用 previous() 两次才能进行 'reverse' 迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64103558/

相关文章:

java - 通过配置更改保留对象的静态模式

java - Spring 集成: receive messages from multiple JMS destinations

java - JOptionPane问题(Java)

c++ - 如何在 std::map 类中定义迭代器

c++ - String::erase 在与迭代器一起使用时抛出 length_error

java - 将字符串转换为日期并格式化日期

c++ - 指向特定类型的 STL 容器样式和迭代器 (C++)

python - 如何在 Python 中读取一行 csv 数据?

python - 在 python 3 中打印 next() 的问题

android - Array 中的图像和声音通过单击 Android 中的下一步按钮来更改