黑马程序员技术交流社区

标题: 遇到一个集合迭代器的问题,请高手指点 [打印本页]

作者: 傻瓜一点红    时间: 2013-6-16 15:30
标题: 遇到一个集合迭代器的问题,请高手指点
今天看了下集合,遇到一个奇怪的问题,请高手指点,用了下迭代器的子类ListIterator,但里面的逆向遍历方法hasPrevious()和previous()有点奇怪,不能一开始就使用这个逆向遍历方法,非得先用正向遍历结束后才能使用逆向遍历,这样逆向遍历的方法才有效,按其原理也就是非得先用正向遍历
使指针指向了最后才能用逆向遍历,那么这样的话就感觉有点问题了,按java设计者的思想应该是可以直接一来就可以采用逆向遍历,这样才能更有实际

意义啊,例子如下:
  1. import java.util.*;
  2. class test
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 ArrayList al=new ArrayList();
  7.                 al.add("123");
  8.                 al.add("qwqe");
  9.                 al.add("abc");
  10.                 al.add("1234");
  11.                 System.out.println(al);
  12.                 ListIterator li=al.listIterator();
  13.                 /*
  14.                 while(li.hasNext())//正向遍历,
  15.                 {
  16.                         System.out.println(li.next());
  17.                 }
  18.                 */
  19.                 while(li.hasPrevious())//逆向遍历,非得先用正向遍历,逆向遍历才能打印出来
  20.                 {
  21.                         System.out.println(li.previous());
  22.                 }
  23.         }
  24. }
复制代码
上面的例子就是非得先用正向遍历,逆向遍历才能答应出来,这就有点奇怪了,请高手指点啊
作者: x378320002    时间: 2013-6-16 15:44
同一个迭代器是用同一个相当于”指针“的东西来标记读到哪了,好能判断下一个还有没有,还能不能读
li.hasNext()和li.hasPrevious()用的当然是同一个指针,这里涉及到指针是怎么判断的呢?
其实指针并不是指在具体的元素上,而是指在元素之间的”空隙“。最开始指在第一个前面,用了
li.Next()一次后就指在第一个和第二个之间,这样再看根据指针判断下一个或者上一个有没有
元素可以迭代。
所以刚才是指在第一个前面,它前面已经没有可以迭代的了,用li.hasPrevious()当然不行

作者: 王瀛    时间: 2013-6-16 15:48
迭代器指针初始位置在“0号空隙”,hasPrevious()判断的结果为false。

作者: 傻瓜一点红    时间: 2013-6-16 15:49
x378320002 发表于 2013-6-16 15:44
同一个迭代器是用同一个相当于”指针“的东西来标记读到哪了,好能判断下一个还有没有,还能不能读
li.hasN ...

那如果是按照这种设计思想,那不是逆向遍历就不太实用了,每次调用逆向遍历时还得调用一些方法把这个指针指到最后面去,这就麻烦得多了,感觉这和设计者的思想也有点相矛盾啊,按设计者的思想应该是可以直接拿来用的啊,这不就变成在用前还得更改一下指针........
作者: 傻瓜一点红    时间: 2013-6-16 15:52
王瀛 发表于 2013-6-16 15:48
迭代器指针初始位置在“0号空隙”,hasPrevious()判断的结果为false。

这么说的话,似乎这种逆向设计模式似乎就不太实用了,用之前还得去把指针调到最后面去......
作者: 薛淑凯    时间: 2013-6-16 15:59
别忘了还有这个方法 ListIterator<E> listIterator(int index) 可以创建一个一开始就指向列表索引为index的元素处的ListIterator
作者: 傻瓜一点红    时间: 2013-6-16 16:04
薛淑凯 发表于 2013-6-16 15:59
别忘了还有这个方法 ListIterator listIterator(int index) 可以创建一个一开始就指向列表索引为index的元 ...

多谢提醒,还真漏看了listIterator(int index)这个方法了,搞得纠结了半天,只有有了这个方法,设计逆向遍历才有意义,这才符合java设计者的思路啊:D,谢谢了
作者: 孙百鑫    时间: 2013-6-22 01:34
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~




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