Java:迭代器

时间:2011-05-06 02:54:56

标签: java oop iterator

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

链接的List Iterator如下所示:

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

我调用了ArrayList Iterator方法/类。

MyArrayListName.iterator();

这是调用迭代器的方法:

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;
}

我的问题是当我调用我的方法通过它们的id(实例变量)获取我的对象时,它总是抓取NEXT对象,而不是我想要的对象。如何使用链接列表和数组列表获取当前对象?

请帮帮我!

4 个答案:

答案 0 :(得分:6)

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

试试这个

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

答案 1 :(得分:4)

问题是你在循环中调用.next()两次:

if (id == xy.next().getId())
{
    return xy.next();
}

两次调用next()会使你的迭代器前进两次,这不是你想要的。您需要将下一个保存在临时变量中,如下所示:

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

答案 2 :(得分:3)

每次使用next()方法时,它都会递增迭代器,所以通过调用

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

return xy.next();

你实际上正在递增迭代器。

您最好的选择是存储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;

}

答案 3 :(得分:2)

您正在拨打.next()两次。

解决方案应该只调用一次并将其保存在这样的变量中:

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