cai772088996
2015-12-23 16:18
采纳率: 84.7%
浏览 1.7k
已采纳

JAVA小白问题:测试Iterable接口的Iterator迭代器方法时遇到的疑问

图片说明

创建个Arraylist集合,放几个数据,然后用迭代器循环遍历,同时想做个判断,如果等于指定的数值的数据出现了,就删除它,继续迭代别的元素,单独用remove删除方法没问题,但把它和next方法合起来用,就报错了,求解,谢谢!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • 月苍 2015-12-24 00:34
    已采纳

    既然你自己也标注了正确的和错误的,我给你提一下,你这里有三个点:

    分别是,it.hasnext(),第一个it.next(),第二个next.

    先解释一下it.hasnext()的意思:如果迭代器有下一个元素(并不会获取,只是告诉你有没有)。it.next():**获取**下一个元素。(_你就是错在这_)
    那么现在顺着这两个意思,你的思路跟着走一边,就很清晰了。
    你第一次走的流程:while(it.hasnext(有没有1?)),it.next(拿到1),it.next(拿到2);
    你第二次走的流程:while(it.hasnext(有没有3?)),it.next(拿到3),it.next(拿到4);
    你第三次走的流程:while(it.hasnext(有没有5?)),it.next(拿到5),it.next(拿到6);
    ......
    ......
    你最后一次走的流程:while(it.hasnext(有没有49?)),it.next(拿到50),it.next(**拿到51**);
    然后最后一次就出问题了。 你有51吗?很明显,你自己定义的就是50,所以没有。然后。报错
    所以,结果就是这样,你在调用一个方法时,应该明白这个方法的含义,这样能减少你的BUG

    至于你正确的,我就不赘述了,你可以自己跟着思考一边,为什么它不会报错。

    点赞 打赏 评论
  • Qroger 2015-12-23 16:32

    每执行一次it.next()会将引用指向下一个元素,你的写法会将下个元素删除

    点赞 打赏 评论
  • 奔腾的野马 2015-12-23 16:53

    程序提示的异常是‘’没有这个元素‘’,想想这是为什么?你的错误在于两次使用了it.next()方法,而你只判断了一次,当System语句输出50后,你的迭代器中已经没有元素了,而接下来又在if语句中再次使用it.next(),这时当然会出现异常。
    解决办法:
    while(it.hasNext()){
    Integer i=it.next();
    System.out.println(i);
    if(i.equals(40)){
    it.remove();
    }
    }

    点赞 打赏 评论
  • 毕小宝 2015-12-24 00:56

    分析你报错的那段代码,你有两次next调用,一个是打印语句system.out.print(it.next()),另一个是if条件判断里面,第一个打印时使用hasNext判断,可以保证打印语句的next肯定是能取到值得。
    而第二个if(it.next)操作直接去取下一个,如果当前迭代器正好是最后一个元素,已经在打印语句里打印了,那么这里就有问题了,因为没有数据了。
    所以根源是你的代码迭代逻辑有问题,打印了next后,继续取下一个next导致的。
    修正代码如下:

     while(it.hasNext()){
         Integer value = it.next();
             System.out.print(value);
             if(value==40){
                  it.remove();
            }
     }
    

    打印语句和后面条件判断使用的值是同一个,先用一个变量接收。

    点赞 打赏 评论
  • QH_JAVA 2015-12-24 01:31

    可以看看 Iterator的源码 看看 hasnext 和 next的区别 你就明白了 ^V^

    点赞 打赏 评论
  • 编程爱好者熊浪 2015-12-24 01:42

    在迭代器中每次循环都只能有有个it.next(),使用了it.next()就是说找下一个数据,但使用了2次就找到了下面的第二个数据,最后面第二个数据是不符合it.hasNext(),本来是不会进入循环的,这样也就调不到it.next()方法,但你执行的时候是2个it.next()一起执行,前面一个it.next()就是最后一个值,后面一个it.next()就会报找不到这个数据的错误。

    点赞 打赏 评论

相关推荐 更多相似问题