A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张学永 于 2012-11-24 23:03 编辑
  1. public static void main(String[] args) {
  2.                 ArrayList<String> al = new ArrayList<String>();
  3.                 al.add("你");
  4.                 al.add("好");
  5.                 al.add("哈");
  6.                 ListIterator<String> it = al.listIterator();
  7.                 while(it.hasPrevious()){
  8.                         String s = it.previous();
  9.                         System.out.println(s);
  10.                 }
  11.         }
复制代码
这段代码,没有结果。为什么???而换成it.next()和it.hasNext()就有结果。
我自己测试过,如果直接打印it.previous()会报告NoSuchElementException
求解释,为什么会出此异常???不是逆向迭代么???

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
因为迭代开始的时候,要看指针的位置
↓指针的位置
你 好 哈
但是previous()是返回列表中的前一个元素。
而"你"前面是没有元素的所以会报告NoSuchElementException
回复 使用道具 举报
蔡汉康 发表于 2012-11-24 22:55
因为迭代开始的时候,要看指针的位置
↓指针的位置
你 好 哈

为什么呢?指针最开始不应该是在最后面么?逆向迭代的初始位置为什么在最前面呢?
回复 使用道具 举报
it.hasPrevious();//第一个前面没有元素,条件不成立,就不打印喽

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
对于ArrayList列表,当你加完第一个字符后,指针会自动指向下一个,等所有的元素都加完后,指针就又回到第一个元素上了,所以要向下找,如果是LinkedList列表,它的底层是链表的结构,你就可以自己指定,指针的指向位置,就可以用previous()方法,向前读取了
回复 使用道具 举报
这个真没遇到过,以前老师讲的都是这样的:
           Iterator<String> it = al.iterator();
                while (it.hasNext()) {
                        String s = it.next();
                        System.out.println(s);
                }
而且,你所用的迭代器是List自己所特有的我们一般都用Iterator
回复 使用道具 举报
ListIterator操作时可以进行双向迭代。
使用ListIterator接口中的hasPrevious()方法由后向前判断,并使用Previous()方法取出前一个元素
进行双向迭代代码如下:
public static void main(String[] args) {
         
                ArrayList<String> al = new ArrayList<String>();

                al.add("你");

                al.add("好");

                al.add("哈");

                ListIterator<String> it = al.listIterator();
                System.out.println("由前向后输出:");
                while(it.hasNext()){
                         
                    String s = it.next();

                    System.out.println(s);
                }
                System.out.println("由后向前输出:");

                while(it.hasPrevious()){

                        String s = it.previous();

                       System.out.println(s);

                }
        }
由后向前输出时必须先由前向后输出,也就是说在使用ListIterator接口进行双向输出时,
如果想完成由后向前的输出,一定要先由前向后输出。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马