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

问题描述

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

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

解决方案

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

分别是,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

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

解决方案二:

java Iterable接口和Iterator迭代器

解决方案三:

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

解决方案四:

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

解决方案五:

分析你报错的那段代码,你有两次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();
        }
 }

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

解决方案六:

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

解决方案七:

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

时间: 2024-11-01 22:00:54

arraylist-JAVA小白问题:测试Iterable接口的Iterator迭代器方法时遇到的疑问的相关文章

java小白又来问问题啦。关于方法调用

问题描述 java小白又来问问题啦.关于方法调用 直接上代码啦:问题也在代码的解释里啦:麻烦各位大神啊 public class Method{ public static void main(String[]args){//main方法可以调用main方法所在的类中的定义的其他方法,也可以调用别的类中的方法.(书上这么写的) System.out.print("The grade is:"); printGrade(78.5);//调用方法时要注意参数的传递,在 这里78.5就是实参

dao.impl实现了dao接口,重写save方法时提示去掉@Override,什么原因嘛

问题描述 dao.impl实现了dao接口,重写save方法时提示去掉@Override,什么原因嘛 我的版本也是1.6的..它自动跳出来的就没有@Override注解,我手动加上它提示必须重写父类方法,让去掉@Override 解决方案 有时候是会出现这样的情况,你删掉@Override就行了.只要没报错就没影响的. 解决方案二: 不要理他就好了,因为这是JVM问题,你不用理 解决方案三: 开发环境要注意项目里的jdk和tomcat JDK要匹配 解决办法: 1,在右键项目选择Properti

JAVA集合框架之List接口实现类

上一篇博客<JAVA集合框架之Set接口实现类>中介绍了Set接口的相关实现类,这一篇将介绍List接口的实现类. java.util.ArrayList< E > ArrayList有点类似于数组,相比较于数组而言,ArrayList可以动态的更改元素个数,相对于数组较为灵活. 每个 ArrayList 实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于列表的大小.随着向 ArrayList 中不断添加元素,其容量也自动增长.并未指定增长策略的细节,因为这不

java笔记四:Set接口

Set不保存重复的元素.Set中最常被使用的是测试归属性,你可以很容易的询问某个对象是否在某个Set中.Set具有与Collection完全一样的接口,因此没有任何额外的功能.实际上Set就是Collection,只是行为不同. 实现了Set接口的主要有HashSet.TreeSet.LinkedHashSet这几个共同点就是每个相同的项只保存一份.他们也有不同点,区别如下: 1.HashSet: HashSet使用的是相当复杂的方式来存储元素的,使用HashSet能够最快的获取集合中的元素,效

希望得到大神的帮助-JAVA小白向大神求助。mousemotionlistener

问题描述 JAVA小白向大神求助.mousemotionlistener 代码可能有点乱而长.我就是想问鼠标控制不了 hero.png这个图片的移动 package start; import javax.swing.ImageIcon; import javax.swing.JFrame; public class StartFrame extends JFrame{ /** * */ public int x; public int y; public static StartFrame s

Iterator、Iterable接口的使用及详解

Java集合类库将集合的接口与实现分离.同样的接口,可以有不同的实现. Java集合类的基本接口是Collection接口.而Collection接口必须继承java.lang.Iterable接口. 以下图表示集合框架的接口,java.lang以及java.util两个包里的.其他部分可以从左向右看,比如Collection的Subinterfaces有List,Set以及Queue等. package java.util; /** * An iterator over a collectio

使用 Visual Studio Team Test 进行单元测试和java中的测试

原文:使用 Visual Studio Team Test 进行单元测试和java中的测试   C#中test测试地 方法一. 1.从NUnit官网(http://www.nunit.org/index.php)下载最新版本NUnit,当前版本为NUnit2.5.8. 2.安装后,在VS2008中新建测试项目StartNUnit 3.右击项目选择属性,在打开的窗口中选择调试.如图: 4.选择启动外部程序,并定位到NUnit的启动程序nunit.exe.如图: 5.在项目中添加NUnit引用,如图

做一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处

做一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处 interface Animal{             //动物的接口    public void eat(Food food); //接口中只有抽象的方法和静态常量!这里void前面省略了abstract.同样,变量可以省略static final} class Cat implements Animal //一种动物类:猫  {      public void eat(Food food) //这里是对

使用 Jtest:一款优秀的 Java 代码优化和测试工具

Jtest 简介 Jtest 是 Parasoft 公司推出的一款针对 Java 语言的自动化代码优化和测试工具,它通过自动化实现对 Java 应用程序的单元测试和编码规范校验,从而提高代码的可靠性以及 Java 软件开发团队的开发效率. 主要功能 静态代码分析: 静态代码分析是指不运行源程序,仅通过分析源程序的语法.结构.接口等来检查程序正确性,找出代码隐藏的缺陷之处. Jtest 的静态代码分析功能能够按照其内置的超过 800 条的 Java 编码规范自动检查并纠正这些隐蔽且难以修复的编码错