黑马程序员技术交流社区

标题: 列表迭代器不出结果!谁能解释解释??? [打印本页]

作者: 张学永    时间: 2012-11-24 22:38
标题: 列表迭代器不出结果!谁能解释解释???
本帖最后由 张学永 于 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
求解释,为什么会出此异常???不是逆向迭代么???


作者: 蔡汉康    时间: 2012-11-24 22:55
因为迭代开始的时候,要看指针的位置
↓指针的位置
你 好 哈
但是previous()是返回列表中的前一个元素。
而"你"前面是没有元素的所以会报告NoSuchElementException
作者: 张学永    时间: 2012-11-24 22:56
蔡汉康 发表于 2012-11-24 22:55
因为迭代开始的时候,要看指针的位置
↓指针的位置
你 好 哈

为什么呢?指针最开始不应该是在最后面么?逆向迭代的初始位置为什么在最前面呢?
作者: 种生祥    时间: 2012-11-24 23:07
it.hasPrevious();//第一个前面没有元素,条件不成立,就不打印喽
作者: 赵红萍    时间: 2012-11-24 23:14
对于ArrayList列表,当你加完第一个字符后,指针会自动指向下一个,等所有的元素都加完后,指针就又回到第一个元素上了,所以要向下找,如果是LinkedList列表,它的底层是链表的结构,你就可以自己指定,指针的指向位置,就可以用previous()方法,向前读取了
作者: 潘天功    时间: 2012-11-24 23:14
这个真没遇到过,以前老师讲的都是这样的:
           Iterator<String> it = al.iterator();
                while (it.hasNext()) {
                        String s = it.next();
                        System.out.println(s);
                }
而且,你所用的迭代器是List自己所特有的我们一般都用Iterator
作者: 潘天功    时间: 2012-11-25 11:44
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接口进行双向输出时,
如果想完成由后向前的输出,一定要先由前向后输出。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2