黑马程序员技术交流社区

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

作者: 钟伟杰    时间: 2013-4-23 01:56
标题: 关于iterator迭代器问题?
本帖最后由 钟伟杰 于 2013-4-23 10:59 编辑

import java.util.*;
class TestDemo2
{
       public static void main(String[] args)
       {
              ArrayList al = new ArrayList();
              al.add("java01");
              al.add("java02");
              al.add("java03");
              al.add("java04");

              Iterator it = al.iterator();

              while(it.hasNext())
              {
                     System.out.println("第一次:"+it.next());
              }
              while(it.hasNext())
              {
                     System.out.println("第二次:"+it.next());
              }
       }
}

结果只是输出第一次遍历的元素。
next():方法只是返回迭代的下一个元素,一次遍历后ArrayList中的元素应该还在啊,怎么第二次的遍历没有显示呢?
作者: 沈浩    时间: 2013-4-23 02:07
因为迭代器内的指针已到集合末尾
要想在一次遍历集合  需要重新获取迭代器 (好比指针复原一样)
作者: 续圆凯    时间: 2013-4-23 02:19
你可以第二次遍历的时候,再重新定义一个迭代器。
作者: smallsea    时间: 2013-4-23 07:19
迭代器:当迭代器进行循环,到迭代器结束时,迭代器是不会从新开始,只能是你重新在获取一个新的迭代器,否则,他是没有数据的;
例如:  
public static void main(String[] agrs) {

                 ArrayList al= new ArrayList();
         al.add("java01");
         al.add("java02");
         al.add("java03");
         al.add("java04");

         Iterator it = al.iterator();

         while(it.hasNext())
         {
                System.out.println("第一次:"+it.next());
         }
         
         it = al.iterator();

         while(it.hasNext())
         {
                System.out.println("第二次:"+it.next());
         }
        }
这样子的话,就可输出第二次。
作者: 肖川    时间: 2013-4-23 08:36
本帖最后由 肖川 于 2013-4-23 08:55 编辑

第一次遍历后ArrayList中的元素是还在啊,但是iterator迭代器已经循环完成了啊,所以进入第二个for循环的时候it已经没有数据了啊。如果你想知道,第几次迭代出的是哪个元素可以这样写:
  1. Iterator it = al.iterator();

  2. int i=1;     
  3. Iterator it = al.iterator();
  4. while(it.hasNext())
  5.          {
  6.                 System.out.println("第"+i+"次:"+it.next());
  7.                 i++;
  8.          }
复制代码

作者: 陈迎春    时间: 2013-4-23 09:13
第一次迭代结束的时候迭代器已经指向了末尾,已经没有next元素了。。。所以在你第二次迭代是已经没有元素了。。。。
作者: 吴文彬    时间: 2013-4-23 09:38
第二次迭代器已经指向尾部了.就好比for(i = 0; i < len;i++),一遍循环下来,i不是已经是为len了。所以第二遍遍历的时候,还要初始化迭代器。
作者: 何羡玉    时间: 2013-4-23 10:15
因为你用的是迭代器,用迭代方法,迭代方法的特点是,如果容器里还有元素,迭代器就会把元素取出来,每取完一次元素之后,就用hasNext()方法判断容器内是否剩元素,如果还有,则返回true,所以第一个while()括号里的表达式就为真,那就会进入循环,直到把容器里的元素全部取出来。元素全部取出来之后,hasNext()返回的就是false了。所以执行到第二个while时,false不满足条件,所以根本不会进入到循环里面,所以你的第二次就不会被打印了。懂了没有,哈哈哈。
作者: 钟伟杰    时间: 2013-4-23 10:54
沈浩 发表于 2013-4-23 02:07
因为迭代器内的指针已到集合末尾
要想在一次遍历集合  需要重新获取迭代器 (好比指针复原一样) ...

谢谢,明白了
作者: 钟伟杰    时间: 2013-4-23 10:54
沈浩 发表于 2013-4-23 02:07
因为迭代器内的指针已到集合末尾
要想在一次遍历集合  需要重新获取迭代器 (好比指针复原一样) ...

谢谢,明白了
作者: 钟伟杰    时间: 2013-4-23 10:57
smallsea 发表于 2013-4-23 07:19
迭代器:当迭代器进行循环,到迭代器结束时,迭代器是不会从新开始,只能是你重新在获取一个新的迭代器,否 ...

谢谢你,不过纠正一下,迭代完集合的数据还在,正如一二楼说的只是指针指向了最后面,在迭代完后面打印一下集合就得到验证了。
作者: 钟伟杰    时间: 2013-4-23 10:58
肖川 发表于 2013-4-23 08:36
第一次遍历后ArrayList中的元素是还在啊,但是iterator迭代器已经循环完成了啊,所以进入第二个for循环的时 ...

谢谢,明白了




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