黑马程序员技术交流社区

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

作者: 彭盼    时间: 2012-3-16 23:38
标题: 迭代器的遍历问题
import java.util.*;
class IrTest
{
    ArrayList a2 = new ArrayList();
        a2.add("张三");
                a2.add("李四");
                a2.add("王二");

        Iterator T = a2.iterator();

        public void BianLi()
    while(iteratorSub.hasNext()){
        System.out.println("第一次遍历");
    }
     while(iteratorSub.hasNext()){
        System.out.println("第二次遍历。");
    }
}
class TestBl
{
        public static void main(String[] args)
                IrTest a=new IrTest();
            a.BianLi();
}
程序最后的结果是第一次遍历成功,但第二次却失败了,这是为什么,是迭代器本身不能做两次遍历吗
作者: 李深山    时间: 2012-3-16 23:58
hasNext
boolean hasNext()以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。

指定者:
接口 Iterator<E> 中的 hasNext
返回:
如果以正向遍历列表,列表迭代器有多个元素,则返回 true。

--------------------------------------------------------------------------------

next
E next()返回列表中的下一个元素。可以重复调用此方法来迭代此列表,或混合调用 previous 来前后移动(注意交替调用 next 和 previous 将重复返回相同的元素)。

指定者:
接口 Iterator<E> 中的 next
返回:
列表中的下一个元素。
抛出:
NoSuchElementException - 如果没有可迭代的下一个元素。
指针没有回到第一各元素,没有可迭代的下一个元素。


作者: 王利强    时间: 2012-3-17 00:11
迭代器hasNext()的原理是指针的向后移动,每运行一次it.next(),指针向后移动一位,当你第一次遍历之后,指针已经指到最后了,所以你第二次还有hasNext()遍历的话肯定是不行的,因为指针已经到头,没有下一个可以迭代的。但是可以采用hasPrevious()由后向前遍历,毕老师在课上讲得很清楚,不知道你明白了没有
作者: 冯建鹏    时间: 2012-3-17 00:23
老兄当我复制你的代码到编译器是 好多不合理的地方啊 虽然很多错的。但是你说你运行结果第一次遍历成功了 第二次失败, 我就把你这个代码当成可以运行的代码给你解释吧

迭代器的方法有  hasNext();判断是否有 下个元素 如果有下个元素返回true ,如果没有下个元素返回false
                                 next():返回下个元素。
                     remove() :从迭代器指向的 collection 中移除迭代器返回的最后一个元素
  第一次你使用while循环后hasNext()指针已经制定到最后,所以你第二次再次判断的时候指针后面已经不再有元素了所以返回false所以就不会执行第二个while里面的代码了。。希望对你有帮助        仔细看看迭代器很好理解的。
           
作者: 丁佼    时间: 2012-3-17 00:31
首先不评价您的代码。。。竟然说第一遍跑起了。。骗人。{:soso_e109:}拿分不容易啊,老师,我是修改了半小时之后才跑起的,半夜12点在挣分数的孩子你伤不起啊。。给个分吧。。。

第一次遍历之后迭代器已经读到了集合的末尾,已经没有next了,迭代器.hasNext()返回值为假,所以会结束第一次循环;第二次循环一开始,这时迭代器就已经处在末尾的位置,所以直接返回“假”退循环。
如果要第二次使用迭代器的话,需要把迭代器回置。使用语句 T = a2.iterator(); 即可

另附修改后代码(您的代码花括号少了我就不说什么了。。为什么迭代器在使用的时候和声明的时候会不是同一个名字??{:soso_e103:}):
import java.util.*;
class IrTest
{   
    public void BianLi()
        {
                ArrayList<String> a1 = new ArrayList<String>();
                a1.add("张三");
                a1.add("李四");
                a1.add("王二");

                Iterator T = a1.iterator();

                while(T.hasNext())
                {
                        System.out.println("第一次遍历");
                        System.out.println(T.next());
                }
       
                 T = a1.iterator();  //重复使用迭代器之重点。。。
                 
                 while(T.hasNext())
                {
                        System.out.println("第二次遍历。");
                        System.out.println(T.next());
                }
        }
}
class TestBl
{
        public static void main(String[] args)
        {
                IrTest a=new IrTest();
        a.BianLi();
        }
}
作者: 黑马肖凯骏    时间: 2012-3-17 00:43
hasNext()的问题,你得重置迭代器才行,不然运行一次后next已经指向最后了,再执行第二次肯定就不行了啊!
作者: 彭盼    时间: 2012-3-17 11:28
本帖最后由 彭盼 于 2012-3-17 11:55 编辑

不好意思,我习惯每次写完都留有备份的,以便于修改对照,发的时候应该发我修改后运行OK的:

import java.util.*;
class IrTest
{
    public static void main(String[] args)
        {
    ArrayList a2 = new ArrayList();
        a2.add("张山");
                a2.add("李四");
                a2.add("王五");

        Iterator T = a2.iterator();

                        while(T.hasNext())
                        {
                                Object s1 = T.next();

                                System.out.println("第一次遍历:");
                       
                        }
                        while(T.hasNext())
                        {       
                                Object s1 = T.next();
                                System.out.println("第二次遍历。");
                        }
       
      
        }
}
现在明白为什么不进行第二次遍历了,多谢各位




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