menu HCG_Sky's Blog
more_vert
chevron_right 首页 » 学习笔记,教程,随笔 » Java笔记-Previous方法反向遍历没反应的问题
Java笔记-Previous方法反向遍历没反应的问题
2021-12-14 | 学习笔记,教程,随笔 | 暂无评论 | 1664 次阅读 | 787字

不是反向遍历么?顶墙了?这倒车咋倒不动了?

前言

 今天在学习集合分支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里的代码块,即便为trueprevious()也会报错,大家尽可以试试,这里我就不做展示了,为了方便大家理解我画了张图供大家理解


问题的解决

解决方法:
由于“指针”默认位置为 索引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);
        }
    }
}

写在最后

 都看到这了,确定不去看看第二个问题么哈哈哈
第二个问题点击传送
 看了这么多~今天你学废了吗哈哈哈!


废话少说

快去提升吧哈哈
文章目录
发表评论
暂无评论
textsms
account_circle
email
link


七牛云 腾讯云 阿里云 百度统计 TrustAsia 安全签章 MySSL 安全签章