前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java笔记-Previous方法反向遍历没反应的问题

Java笔记-Previous方法反向遍历没反应的问题

作者头像
HCG_Sky
发布2022-03-31 21:22:18
1.2K0
发布2022-03-31 21:22:18
举报
文章被收录于专栏:HCG_Sky's Blog

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

前言

 今天在学习集合分支List的特有迭代器ListIterator时遇到两个疑惑,这是第一个,由于角度比较奇怪,教学视频里也没有提及,在和度娘一番攀谈交心后,我仍是一知半解,但这么巧的是,在第二个疑惑中我找到了它们的共通之处,两个问题也就迎刃而解了,这里先来说说这第一个小问题。

 这里先为大家引入一下ListIterator的常用方法

E next():返回迭代中的下一个元素 boolean hasNext():如果迭代具有更多元素,则返回true E previous():返回列表中的上一个元素 boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true void add():将指定元素插入列表

 在这里主要疑惑的是E previous()boolean hasPrevious()这两个方法,根据方法描述,我们很容易理解为就是 从集合的最后一位开始返回前一个元素 以及 从最后一位开始判断前面是否存在元素,于是在测试学习这个方法时我写出了这样的代码

以下附上代码及图示,方便大家理解我遇到的这个问题

代码语言:javascript
复制
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" 这三个字符串的

代码语言:javascript
复制
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这个方法逆向遍历,前提是必须先正向遍历到结尾,让“指针”指向最后一位索引,然后才能逆序遍历

其代码如下

代码语言:javascript
复制
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);
        }
    }
}

写在最后

 都看到这了,确定不去看看第二个问题么哈哈哈

第二个问题点击传送

 看了这么多~今天你学废了吗哈哈哈!

废话少说

快去提升吧哈哈

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 分析问题
      • 问题的解决
        • 写在最后
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档