黑马程序员技术交流社区

标题: 关于ListIterator的反向迭代功能。。。 [打印本页]

作者: 张旺达    时间: 2013-4-23 10:17
标题: 关于ListIterator的反向迭代功能。。。
本帖最后由 张旺达 于 2013-4-23 13:23 编辑
  1. import java.util.*;
  2. public class ListIteratorTest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 String[] books = {"AAAAA","BBBBB"};

  7.                 List bookList = new ArrayList();

  8.                 for (int i=0; i<books.length; i++)
  9.                 {
  10.                         bookList.add(books[i]);
  11.                 }
  12.                
  13.                 ListIterator lit = bookList.listIterator();

  14.                 while(lit.hasNext())
  15.                 {
  16.                         System.out.println(lit.next());
  17.                         lit.add("-------分隔符-------");
  18.                 }

  19.                 System.out.println("=======下面开始反向迭代=======");

  20.                 while(lit.hasPrevious())
  21.                 {
  22.                         System.out.println(lit.previous());
  23.                 }
  24.         }
  25. }
复制代码
输出结果是:

AAAAA
BBBBB
=======下面开始反向迭代=======
--------分隔符--------
BBBBB
--------分隔符--------
AAAAA



请帮我读一下此程序,顺序有点看不明白啊。。。
作者: 薛淑凯    时间: 2013-4-23 12:10
本帖最后由 薛淑凯 于 2013-4-23 12:13 编辑

API文档关于ListIterator的add()方法的说明   
将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);
while(lit.hasNext())
                {
                 System.out.println(lit.next());
                 lit.add("-------分隔符-------");
                }
lit里是 AAAAA
          BBBBB
每次添加到next()返回元素前边   AAAAA
                                              -------分隔符-------
                                              BBBBB
                                              -------分隔符-------
反向打印也就是你的结果了
作者: 郭登旭    时间: 2013-4-23 12:34
以前没有注意到这个细节,开始我还以为程序写错了,在这也学习了。说一下我的理解。
这个问题关键点在这
while(lit.hasNext())                                          //判断集合不为空
                {
                        System.out.println(lit.next());   //指针指向AAAAA,正向输出第一个元素AAAAA   ;  
                                                                        //第二次循环输出BBBBB
                        lit.add("-------分隔符-------");      //然后在当前指针位置向集合添加"-------分隔符-------",即AAAAA的后面   ;
                                                                        //第二次循环在BBBBB的后面添加"-------分隔符-------"
                }

     List的底层是用可变数组实现的,当用集合产生ListIterator迭代器遍历集合时,迭代器要遍历的对象就是当前集合,集合是用数组实现的,这个数组长度是固定的,即该集合是不会变的,可以认为处于锁定状态。虽然遍历过程中可以对数组进行增删改的操作,但这个集合就用另一个数组实现的,对于迭代器来说,下次遍历,要遍历的对象才是用这个新数组实现的集合。
     所以第一次遍历按原集合输出,第二次遍历输出修改后的集合元素,只不过是反序输出。





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