黑马程序员技术交流社区

标题: 关于列表迭代器逆向迭代的问题!!求解决! [打印本页]

作者: 聂益飞    时间: 2013-3-20 18:22
标题: 关于列表迭代器逆向迭代的问题!!求解决!
本帖最后由 聂益飞 于 2013-3-20 23:29 编辑
  1. import java.util.*;
  2.         class  Day17Test3
  3.         {
  4.                 public static void main(String[] args)
  5.                 {
  6.                         List list=new ArrayList();
  7.                         list.add("hello");
  8.                         list.add("world");
  9.                         list.add("java");
  10.                         //列表迭代器
  11.                         
  12.                         ListIterator lit=list.listIterator();
  13.                         while(lit.hasNext())
  14.                         {
  15.                                 System.out.println(lit.next());
  16.                                 lit.add("study");
  17.                         }

  18.                         //逆向迭代
  19.                         //ListIterator lits=list.listIterator();
  20.                         while(lit.hasPrevious())
  21.                         {
  22.                                 System.out.println(lit.previous());
  23.                         }
  24.                 }
  25.         }
复制代码
/*
执行结果为什么是:
hello
world
java
**************************************
study
java
study
world
study
hello
作者: HM赵磊    时间: 2013-3-20 18:57
本帖最后由 HM赵磊 于 2013-3-20 19:09 编辑

两点说:
一、List集合有遍历集合的迭代器有两个:Iterator    ListIterator,但是由于Iterator有她的局限性,即Iterator迭代器没有添加删除结合中元素的方法,如果使用集合对象在迭代的过程中添加或者删除,将会出现异常,所以这个时候ListIterator迭代器就应用而生了,ListIterator可以在迭代的过程中,可以对集合中的元素进行添加和删除。
二、对于ListIterator中的add方法。
是将指定的元素插入到列表中,插入的位置是next返回的下一个元素的前面(如果next下一个元素存在的话),在他插入之后,不影响对next的后续调用,所以你在第一次迭代的时候并且添加元素,但是遍历出来的结果是hello world  java  而第二次迭代时的结果是 study  hello study   world  study   java 。

另:下面的内容是来自JAVA API 文档 中的ListIterator 中 add方法的介绍。
void add(E e)
将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。新元素被插入到隐式光标前:不影响对 next 的后续调用,并且对 previous 的后续调用会返回此新元素(此调用把调用 nextIndex 或 previousIndex 所返回的值增加 1)。
作者: 刘辉    时间: 2013-3-20 20:18
请看下面注释
import java.util.*;
        class  Day17Test3
        {
                public static void main(String[] args)
                {
                        List list=new ArrayList();
                        list.add("hello");
                        list.add("world");
                        list.add("java");
                        //列表迭代器
                        
                        ListIterator lit=list.listIterator();
                        while(lit.hasNext())
                        {
                                System.out.println(lit.next());
                                lit.add("study");//这里每次你顺序迭代的时候都循环一次就添加了一个study,所以添加的结果就变成了hello study world study  java
                        }                            //study 当你逆向迭代的时候当然输出的就是下面的内容了


                        //逆向迭代
                        //ListIterator lits=list.listIterator();
                        while(lit.hasPrevious())
                        {
                                System.out.println(lit.previous());
                        }
                }
        }

作者: 移动小坦克    时间: 2013-3-20 20:28
你是用列表迭代器添加元素,当然当你对集合进行跌代的时候,
也不能用集合本身的添加功能,不然会抛出异常,
当你next()完以后,迭代器添加对象的时候,如果该位置不为空,添加对象是在迭代器指向的位置+1的位置添加
所以会出现你那样的打印结果




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