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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谭培龙 初级黑马   /  2012-8-6 13:38  /  1606 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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.         }

复制代码
为什么会报错?迭代器的原理是什么?

7 个回复

倒序浏览
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
和用for来遍历数组差不多。

回复 使用道具 举报
本帖最后由 王程 于 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")
回复 使用道具 举报
18.                                                li.add("java007");

19.                                                li.set("java05");

先替换元素后添加元素就不会报错了,也就是18行和19行换下位置。
回复 使用道具 举报
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);
                }
        }
回复 使用道具 举报
楼上的办法不错呀
回复 使用道具 举报
li.add("java007");
li.set("java05");
楼主的意思我不是很清楚,能解释一下否?是想想增加然后改变?还是说要改变“java02”?
回复 使用道具 举报
问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马