黑马程序员技术交流社区

标题: 列表迭代器的一个问题(问题已解决) [打印本页]

作者: 马州州    时间: 2012-8-5 12:26
标题: 列表迭代器的一个问题(问题已解决)
本帖最后由 马州州 于 2012-8-5 20:48 编辑

我的问题很简单,请大家看一下问题再回答,别把笔记整一堆整上来撒,我就是想问一下为什么不能两个功能不能同时实现
我先再java2后面添加一个,然后java2 的角标也没有变,为什么替换的时候就不行了呢


import java.util.*;
class  CollectionDemo
{
public static void main(String[] args)
{
  method_1();
}
public static void method_1()
{
  ArrayList al = new ArrayList();
  
  al.add("java1");
  al.add("java2");
  al.add("java3");
  al.add("java4");
  for (ListIterator li = al.listIterator();li.hasNext() ; )
  {
   Object obj = li.next();
   if (obj.equals("java2"))
   {
    li.add("asd");
    li.set("java23");  //为什么不能两个一起操作,我先添加了一个,但是java2的位置没有变啊

         
   }
   sop(obj);
   sop(obj.hasPrevious());
  }

  
  sop(al);
}



public static void sop(Object obj)
{
  System.out.println(obj);
}
}
上面红色部分代码,在列表迭代器中,判断后,我先添加,然后替换,为什么不行?运行报错如下

然后我查了API还是不太明白,把API对这个异常的解释也贴出来,省的大家再去查了





作者: 张雪磊    时间: 2012-8-5 12:56
本帖最后由 张雪磊 于 2012-8-5 13:55 编辑



import java.util.*;
class  CollectionDemo
{
public static void main(String[] args)
{
  method_1();
}
public static void method_1()
{
  ArrayList al = new ArrayList();
  
  al.add("java1");
  al.add("java2");
  al.add("java3");
  al.add("java4");
  for (ListIterator li = al.listIterator();li.hasNext() ; )
  {
   Object obj = li.next();
   if (obj.equals("java2"))
   {
   li.add("asd");
    li.set("java23");


/*
set的使用规则确实是这样的,迭代的时候不能添加和删除, 我找了一下set 方法的源代码
     public void set(E e) {
           if (lastRet < 0)
                throw newIllegalStateException();
           checkForComodification();
           try {
                ArrayList.this.set(lastRet, e);
           } catch (IndexOutOfBoundsException ex) {
                throw newConcurrentModificationException();
           }
       }

他底层调用的是ArrayList的set(int index, E element) 方法,用的是迭代时获得的脚标,它不是 根据光标位置定义的;它们是根据对调用 next() 或 previous() 所返回的最后一个元素的操作定义的。 就是说如果你添加或删除了元素,那 next() 或 previous() 所返回的最后一个元素的位置就不确定了,那设置的位置也就不能确定,
  */
   }
   sop(obj);
   sop(obj.hasPrevious());
  }

  
  sop(al);
}



public static void sop(Object obj)
{
  System.out.println(obj);
}
}




作者: 刘真    时间: 2012-8-5 13:09
if (obj.equals("java2"))
   {
    li.add("asd");
    li.set("java23");  //为什么不能两个一起操作,我先添加了一个,但是java2的位置没有变啊

         
   }
回答为什么不能一起操作?
set
void set(E e)用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。只有在最后一次调用 next 或 previous 后既没有调用 ListIterator.remove 也没有调用 ListIterator.add 时才可以进行该调用。
参数:
e - 用于替换 next 或 previous 返回的最后一个元素的元素。
IllegalStateException - 如果既没有调用 next 也没有调用 previous,或者在最后一次调用 next 或 previous 后调用了 remove 或 add。

  1. import java.util.*;
  2. class CollectionDemo2
  3. {
  4. public static void main(String[] args)
  5. {
  6. method_1();
  7. }
  8. public static void method_1()
  9. {
  10. ArrayList al = new ArrayList();

  11. al.add("java1");
  12. al.add("java2");
  13. al.add("java3");
  14. al.add("java4");
  15. for (ListIterator li = al.listIterator();li.hasNext() ; )
  16. {
  17. Object obj = li.next();
  18. if(obj.equals("java2"))
  19. {
  20. li.add("asd");
  21. // li.set("java23");
  22. }
  23. sop(obj);
  24. sop( li.hasPrevious());//版主写的是sop(obj.hasPrevious())应该不对,obj是Object类型,而不是ListIterator类型
  25. }

  26. sop(al);
  27. }
  28. public static void sop(Object obj)
  29. {
  30. System.out.println(obj);
  31. }
  32. }
复制代码

85SP%Z9~W`J3P4{CWTI8H{3.jpg (51.44 KB, 下载次数: 26)

运行结果

运行结果

作者: 马州州    时间: 2012-8-5 13:51
张雪磊 发表于 2012-8-5 12:56

这个是列表迭代器,是可以添加的,两个功能分开来用就可以实现,但是放到一起就不行了
作者: 马州州    时间: 2012-8-5 16:00
没有人能来回答一下么?上面的两个答案都不是我想要的
作者: 马州州    时间: 2012-8-5 19:17
木有人来回答一下么?
作者: 王志明    时间: 2012-8-5 20:21
三楼已经说的很好了啊,API里面就是那样说的

作者: 官文昌    时间: 2012-8-5 20:41
import java.util.*;
class  CollectionDemo
{
public static void main(String[] args)
{
  method_1();
}
public static void method_1()
{
  ArrayList al = new ArrayList();

  al.add("java1");
  al.add("java2");
  al.add("java3");
  al.add("java4");
  for (ListIterator li = al.listIterator();li.hasNext() ; )
  {
   Object obj = li.next();
   if (obj.equals("java2"))
   {
           li.set("java23");
           package test;

import java.util.*;
class  CollectionDemo
{
public static void main(String[] args)
{
  method_1();
}
public static void method_1()
{
  ArrayList al = new ArrayList();

  al.add("java1");
  al.add("java2");
  al.add("java3");
  al.add("java4");
  for (ListIterator li = al.listIterator();li.hasNext() ; )
  {
   Object obj = li.next();
   if (obj.equals("java2"))
   {
           li.set("java23"); //注意了,你是判断后执行的add()方法,你add()方法已经把判断用了,而set()方法,已经没有了判断的条件它怎么能执行呢???
           li.add("asd");
   //为什么不能两个一起操作,我先添加了一个,但是java2的位置没有变啊

   }
   sop(obj);
   sop(li.hasPrevious());
  }


  sop(al);
}



public static void sop(Object obj)
{
  System.out.println(obj);
}
}
   //为什么不能两个一起操作,我先添加了一个,但是java2的位置没有变啊

   }
   sop(obj);
   sop(li.hasPrevious());//这里调用要用li,
  }


  sop(al);
}



public static void sop(Object obj)
{
  System.out.println(obj);
}
}

作者: 马州州    时间: 2012-8-5 20:41
张雪磊 发表于 2012-8-5 12:56

那这么说,是两个不能同时用么?
作者: 马州州    时间: 2012-8-5 20:48
问题已解决,谢谢大家啦
作者: 张雪磊    时间: 2012-8-5 20:49
马州州 发表于 2012-8-5 20:41
那这么说,是两个不能同时用么?

是的!!!!!
作者: 马州州    时间: 2012-8-5 20:49
张雪磊 发表于 2012-8-5 20:49
是的!!!!!

不过把set和add两条命令换一下位置就可以了




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