Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:迭代器_Java_Oop_Iterator - Fatal编程技术网

Java:迭代器

Java:迭代器,java,oop,iterator,Java,Oop,Iterator,所以我正在开发一个包含两种数据类型的程序:链表和Arraylist 链表迭代器如下所示: private class NodeIterator implements Iterator<StudentIF> { private Node curr; public NodeIterator(Node head) { curr = head; } public void remove() { }

所以我正在开发一个包含两种数据类型的程序:链表和Arraylist

链表迭代器如下所示:

private class NodeIterator implements Iterator<StudentIF> {
        private Node curr;

        public NodeIterator(Node head) {
            curr = head;
        }

        public void remove() { }

        public boolean hasNext() {
            if (curr == null)
                return false;
            return true;
        }

        public StudentIF next() {
            Node temp = curr;
            curr = curr.getNext();
            return temp.getData();
        }

    } // end class NodeIterator
下面是调用迭代器的方法:

public StudentIF getStudent(int id) {
    Iterator<StudentIF> xy = iterator();
    while (xy.hasNext()) {
        if (id == xy.next().getId()) {
            return xy.next();
        }
    }
    // Student doesn't exist
    return null;
}
public StudentIF getStudent(int-id){
迭代器xy=迭代器();
while(xy.hasNext()){
如果(id==xy.next().getId()){
返回xy.next();
}
}
//学生不存在
返回null;
}
我的问题是,当我调用我的方法通过它们的id(实例变量)获取对象时,它总是获取下一个对象,而不是我想要的对象。如何使用链表和数组列表获取当前对象

请帮帮我

您使用
next()
方法两次,这可能就是原因

试试这个

  while (xy.hasNext()) {
        StudentIF tmp = xy.next();
        if (id == tmp.getId()) {
            return tmp;
        }
每次使用next()方法时,它都会递增迭代器,因此通过调用

if (id == xy.next().getId())

实际上,您正在递增迭代器

最好是存储xy.next(),进行所需的任何比较,然后按如下方式返回:

public StudentIF getStudent(int id) {
Iterator<StudentIF> xy = iterator();
while (xy.hasNext()) {
    StudentIF student = xy.next();
    if (id == student.getId()) {
        return student;
    }
}
// Student doesn't exist
return null;
public StudentIF getStudent(int-id){
迭代器xy=迭代器();
while(xy.hasNext()){
StudentIF student=xy.next();
如果(id==student.getId()){
留学生;
}
}
//学生不存在
返回null;

}您正在调用
.next()
两次

解决方案应该只调用一次,并将其保存在如下变量中:

 while (xy.hasNext()) {
        StudentIF student = xy.next();
        if (id == student.getId()) {
            return student;
        }
    }
StudentIF nextStudent = xy.next();
if (nextStudent.getId() == id)
{
    return nextStudent;
}

问题是您在这里的循环中调用了.next()两次:

if (id == xy.next().getId())
{
    return xy.next();
}
调用next()两次将使迭代器前进两次,这不是您想要的。您需要将下一个off保存在一个临时变量中,如下所示:

 while (xy.hasNext()) {
        StudentIF student = xy.next();
        if (id == student.getId()) {
            return student;
        }
    }
StudentIF nextStudent = xy.next();
if (nextStudent.getId() == id)
{
    return nextStudent;
}

您可能还希望提到可以防止出现问题的for(StudentIF student:xy)语法。回答得好。@ditkin。。。难道他不应该实现Iterable接口来实现它吗?谢谢Brian。我接受了你的回答,因为这是赎罪;好的补偿!:-)我在其他地方有这个bug,这就是我正在修复的;谢谢你的帮助!