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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天看了下集合,遇到一个奇怪的问题,请高手指点,用了下迭代器的子类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. }
复制代码
上面的例子就是非得先用正向遍历,逆向遍历才能答应出来,这就有点奇怪了,请高手指点啊

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

7 个回复

倒序浏览
同一个迭代器是用同一个相当于”指针“的东西来标记读到哪了,好能判断下一个还有没有,还能不能读
li.hasNext()和li.hasPrevious()用的当然是同一个指针,这里涉及到指针是怎么判断的呢?
其实指针并不是指在具体的元素上,而是指在元素之间的”空隙“。最开始指在第一个前面,用了
li.Next()一次后就指在第一个和第二个之间,这样再看根据指针判断下一个或者上一个有没有
元素可以迭代。
所以刚才是指在第一个前面,它前面已经没有可以迭代的了,用li.hasPrevious()当然不行

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
迭代器指针初始位置在“0号空隙”,hasPrevious()判断的结果为false。
回复 使用道具 举报
x378320002 发表于 2013-6-16 15:44
同一个迭代器是用同一个相当于”指针“的东西来标记读到哪了,好能判断下一个还有没有,还能不能读
li.hasN ...

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

这么说的话,似乎这种逆向设计模式似乎就不太实用了,用之前还得去把指针调到最后面去......
回复 使用道具 举报
别忘了还有这个方法 ListIterator<E> listIterator(int index) 可以创建一个一开始就指向列表索引为index的元素处的ListIterator

评分

参与人数 1黑马币 +2 收起 理由
傻瓜一点红 + 2 很给力!

查看全部评分

回复 使用道具 举报
薛淑凯 发表于 2013-6-16 15:59
别忘了还有这个方法 ListIterator listIterator(int index) 可以创建一个一开始就指向列表索引为index的元 ...

多谢提醒,还真漏看了listIterator(int index)这个方法了,搞得纠结了半天,只有有了这个方法,设计逆向遍历才有意义,这才符合java设计者的思路啊:D,谢谢了
回复 使用道具 举报
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马