
不是反向遍历么?顶墙了?这倒车咋倒不动了?
前言
今天在学习集合分支List
的特有迭代器ListIterator
时遇到两个疑惑,这是第一个,由于角度比较奇怪,教学视频里也没有提及,在和度娘一番攀谈交心后,我仍是一知半解,但这么巧的是,在第二个疑惑中我找到了它们的共通之处,两个问题也就迎刃而解了,这里先来说说这第一个小问题。
这里先为大家引入一下ListIterator
的常用方法
E next():返回迭代中的下一个元素
boolean hasNext():如果迭代具有更多元素,则返回true
E previous():返回列表中的上一个元素
boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
void add():将指定元素插入列表
在这里主要疑惑的是E previous()
和boolean hasPrevious()
这两个方法,根据方法描述,我们很容易理解为就是 从集合的最后一位开始返回前一个元素 以及 从最后一位开始判断前面是否存在元素,于是在测试学习这个方法时我写出了这样的代码
以下附上代码及图示,方便大家理解我遇到的这个问题
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Test_1 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("Java");
ListIterator<String> lit = list.listIterator();
while(lit.hasPrevious()){
String s = lit.previous();
System.out.println(s);
}
}
}
代码写好了,在我们的预期中,控制台应该会依次输出 "Java" "World" "Hello" 这三个字符串,可预想的事物总是美好的,现实是残酷的哈哈哈,看如下运行图~

分析问题
在学习过程中,使用E next()
和boolean hasNext()
来进行同样的操作是可以正常依次输出 "Hello" "World" "Java" 这三个字符串的
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Test_1 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("Java");
ListIterator<String> lit = list.listIterator();
while(lit.hasNext()){
String s = lit.next();
System.out.println(s);
}
}
}

那么说明一个什么问题呢?其实我也不知道哈哈哈!但根据各路大神的思路总结出来就是。你可以想象成内存里有一个指针 首先指向的是 "Hello" ,你正向的话就判断下面是否有值,你逆向的话就判断上面是否有值,很明显 "Hello" 的上面没有其他的对象,因此boolean hasPrevious()
的返回值就为false
也就不会运行while
里的代码块,即便为true
,previous()
也会报错,大家尽可以试试,这里我就不做展示了,为了方便大家理解我画了张图供大家理解

问题的解决
解决方法:
由于“指针”默认位置为 索引0 所以我们若需要使用previous这个方法逆向遍历,前提是必须先正向遍历到结尾,让“指针”指向最后一位索引,然后才能逆序遍历重点:
若需要使用previous这个方法逆向遍历,前提是必须先正向遍历到结尾,让“指针”指向最后一位索引,然后才能逆序遍历
其代码如下
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Test_1 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("Java");
ListIterator<String> lit = list.listIterator();
while(lit.hasNext()){
lit.next(); //将指针遍历到最后一位索引
}
//到这里,“指针位置就已经处于 索引2 的位置了”
while(lit.hasPrevious()){
String s = lit.previous();
System.out.println(s);
}
}
}

写在最后
都看到这了,确定不去看看第二个问题么哈哈哈
第二个问题点击传送
看了这么多~今天你学废了吗哈哈哈!
废话少说
快去提升吧哈哈