黑马程序员技术交流社区

标题: 关于迭代器的问题 [打印本页]

作者: 谭培龙    时间: 2012-8-6 13:38
标题: 关于迭代器的问题
  1.         import java.util.*;

  2.         public class ListTest {
  3.                 public static void main(String[] args)
  4.                 {
  5.                         ArrayList al = new ArrayList();
  6.                         al.add("java01");
  7.                         al.add("java02");
  8.                         al.add("java03");
  9.                         al.add("java04");
  10.                         ListIterator li = al.listIterator();

  11.                         while(li.hasNext())
  12.                         {
  13.                                 Object obj = li.next();
  14.                                 if(obj.equals("java02"))
  15.                                 {            
  16.                                                 li.add("java007");
  17.                                                 li.set("java05");
  18.                                         
  19.                                         
  20.                                 }
  21.                         }
  22.                         System.out.println(al);
  23.                 }
  24.         }

复制代码
为什么会报错?迭代器的原理是什么?
作者: 范泰洋    时间: 2012-8-6 14:02
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
和用for来遍历数组差不多。


作者: 王程    时间: 2012-8-6 14:39
本帖最后由 王程 于 2012-8-6 14:43 编辑

ArrayList类中有set方法,完整描述是这样的set(int index, E element),返回值是ArrayList中的参数类型,根据你传入的参数看出,这里调用的是ListIterator中的set方法。
这个方法ListIterator接口的set方法在API中是这样描述的:用指定元素替换 next 或 previous 返回的最后一个元素。只有在最后一次调用 next 或 previous 后既没有调用 ListIterator.remove 也没有调用 ListIterator.add 时才可以进行该调用。
而set()方法在循环中明显不对。
你可以将 li.set(1,"java05");这句话放到循环外面来处理,如果你是想改变指定位置的元素,可以这样写al.set(1,"java05")

作者: 刘学    时间: 2012-8-6 14:42
18.                                                li.add("java007");

19.                                                li.set("java05");

先替换元素后添加元素就不会报错了,也就是18行和19行换下位置。
作者: 纪艺松    时间: 2012-8-6 14:45
import java.util.*;

       class ListTest {
                public static void main(String[] args)
                {
                        ArrayList<String> al = new ArrayList<String>();
                        al.add("java01");
                        al.add("java02");
                        al.add("java03");
                        al.add("java04");
                        ListIterator<String> li = al.listIterator();

                        while(li.hasNext())
                        {
                                Object obj = li.next();
                             
                                if(obj.equals("java02"))
                                {           
                                        li.set("java05");  //可不可以理解成set在使用前整个list的状态不能发生改变;
                                            li.add("java007");
                                   
                                  //         li.set("java05");
                                                
                                }
                                //li.set("java05");
                                
                              
                        }
                        System.out.println(al);
                }
        }
作者: 王程    时间: 2012-8-6 14:45
楼上的办法不错呀
作者: 黑马振鹏    时间: 2012-8-6 15:39
li.add("java007");
li.set("java05");
楼主的意思我不是很清楚,能解释一下否?是想想增加然后改变?还是说要改变“java02”?
作者: 谭培龙    时间: 2012-8-6 19:33
问题已解决




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