提问者:小点点

Iterator不能给我所有的整数,还是我在做什么蠢事?


我的程序出了什么问题,我没有得到输出中的所有整数:? 我是不是做错了什么?

import java.io.Serializable;
import java.util.*;

public class ArrayListDemo7 {


    public static void main(String[] args) {
        ArrayList<Object> al = new ArrayList<Object>();
        System.out.println("Before = " + al.size());
        al.add(10);
        al.add(43);
        al.add(32.5);
        al.add(10);
        al.add(null);
        al.add('A');
        al.add("ABC");
        al.add(10.12);
        al.add(true);
        al.add("Hello");
        al.add(600);
        al.add(900);
        /*- Remove All the objects except integer and string:*/

        Iterator itr = al.iterator();
        while(itr.hasNext()){
            if( itr.next() instanceof  Integer){
                Object obj = itr.next();
                System.out.println(obj);
            }
        }


    }

}

我试图打印的只是整数对象,我能够通过流和其他方式,但它没有工作,因为某些原因?


共3个答案

匿名用户

这是因为您已经调用了ITR.NEXT()2次。 一旦在if条件下则体内。

匿名用户

您将调用next()两次--一次在if条件中,然后在if的正文中,这意味着您将跳过值。 您应该在循环的每次迭代中调用它一次,将从它返回的值存储到一个局部变量,并对它执行所有操作:

while (itr.hasNext()) {
    Obejct obj = itr.next();
    if (obj instanceof  Integer) {
        System.out.println(obj);
    }
}

匿名用户

每当此代码运行于integer时,它都会调用.next()两次:一次在if检查中,第二次是如果if检查成功的话。 这意味着忽略第一个integer,并返回下一个值。 这还意味着,根据列表的结构,如果最后一个元素试图读取列表的末尾,则会对它抛出NosuchelementException

虽然有更常用的方法来实现这一目标(例如流,甚至是增强的foreach循环),但使用相同方法时,一个简单的修复方法是将值存储到变量中。 这样,可以在instanceof检查和println参数中使用相同的值:

Iterator itr = al.iterator();
while(itr.hasNext()){
    Object next = itr.next();
    if(next instanceof Integer){
        System.out.println(next);
    }
}