黑马程序员技术交流社区

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

作者: 胥文    时间: 2013-2-20 17:21
标题: 迭代的问题
本帖最后由 胥文 于 2013-2-20 19:27 编辑

public static void main(String[] args) {
  List c = new ArrayList();
  c.add("abc");
  c.add("abcd");
  c.add("abcde");
  c.add("abcdef");
  ListIterator li = c.listIterator();
  while(li.hasNext())
  {
   Object obj =li.next();
   if(obj.equals("abcd"))
   {
    li.add("123");
    //li.set("234");
    System.out.println(c);//字符串"123"已经加到集合里面去了,按照道理下一个应该是123啊,怎么么没有啊
    System.out.println(obj+"-------------");
   }
   System.out.println(obj);//这里为什么没有打印"123"啊(按照最后的结果这里是应该要打印的啊)
  }
  
}
打印结果是:
abc
[abc, abcd, 123, abcde, abcdef]
abcd-------------
abcd
abcde
abcdef
作者: 黑马刘杰    时间: 2013-2-20 17:44
本帖最后由 黑马刘杰 于 2013-2-20 17:46 编辑
  1. public static void main(String[] args) {
  2.                 List<String> c = new ArrayList<String>();
  3.                 c.add("abc");
  4.                 c.add("abcd");
  5.                 c.add("abcde");
  6.                 c.add("abcdef");
  7.                 ListIterator<String> li = c.listIterator();
  8.                 while (li.hasNext()) {
  9.                         Object obj = li.next();
  10.                         if (obj.equals("abcd")) {
  11.                                 li.add("123");
  12.                                 // li.set("234");
  13.                                 System.out.println(c);// 字符串"123"已经加到集合里面去了,按照道理下一个应该是123啊,怎么么没有啊
  14.                                 System.out.println(obj + "-------------");
  15.                         }
  16.                         System.out.println(obj);// 这里的obj还是指向if前面的li.next,并没有赋新值。所以打印的是原集合中的元素。
  17.                         
  18.                 }
  19. //字符串“123”已经在集合c中了,你可以这样子取出字符串“123”
  20.                 for(Iterator<String> it=c.iterator();it.hasNext();){
  21.                         Object obj=it.next();
  22.                         if(obj.equals("123")){
  23.                                 System.out.println(obj);
  24.                         }
  25.                 }

  26.         }
复制代码

作者: 李挺    时间: 2013-2-20 17:49
我查了下API,是这样说的:
将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。新元素被插入到隐式光标前:不影响对 next 的后续调用,并且对 previous 的后续调用会返回此新元素(此调用把调用 nextIndex 或 previousIndex 所返回的值增加 1)。
作者: 黑马-张洋    时间: 2013-2-20 17:51
同学,我来给你权威的解释,其实就是2楼的英文版。

你把鼠标放在add这个方法上面就可以看到。

请看图,请阅读这段英文,它的中文意思就是2楼所说
The new element is inserted before the implicit
     cursor: a subsequent call to {@code next} would be unaffected, and a
      subsequent call to {@code previous} would return the new element.

所以啊,提醒我们要学好英文,而且很多问题其实java文档中已经有答案了

作者: 罗海云    时间: 2013-2-20 17:52
ListIterator迭代器,允许按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。长度为 n 的列表的迭代器有 n+1 个可能的指针位置, 所以就会出现这种情况
作者: 王钊    时间: 2013-2-20 18:12
本帖最后由 王钊 于 2013-2-20 18:15 编辑

首先看api关于ListIterator一段介绍:系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。
由此可知迭代器在各个元素之间存在一个光标。
再看一段api,关于ListIterator中add()方法说明一段话:该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。新元素被插入到隐式光标前:不影响对 next 的后续调用,并且对 previous 的后续调用会返回此新元素。
也就是说,新元素确实加在了"abcd"和"abcde"之间,但是"abcd"和"abcde"之间还有光标别忘了,这个元素加在了光标之后,上图:
之后你再调用li.next()就会返回光标之后的元素,也就是说"123"被隔过去了。

无标题.png (18.57 KB, 下载次数: 47)

无标题.png

作者: 胥文    时间: 2013-2-20 19:26
王钊 发表于 2013-2-20 18:12
首先看api关于ListIterator一段介绍:系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并 ...

谢谢了
说的很详细




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