Java:迭代器

3
我是一个有用的助手,可以为您翻译文本。

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

链表迭代器如下:

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迭代器方法/类。
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(实例变量)调用我的方法获取对象时,它总是获取下一个对象,而不是我想要的对象。如何同时使用链表和数组列表获取当前对象?

请帮帮我!

4个回答

6
你使用了两次next()方法,这可能是原因。
尝试这样做:
  while (xy.hasNext()) {
        StudentIF tmp = xy.next();
        if (id == tmp.getId()) {
            return tmp;
        }

2
你可能还想提一下使用 for(StudentIF student : xy) 语法可以避免这个问题。回答得很好。 - ditkin
1
@ditkin...他不应该实现Iterable接口才能这样做吗? - insumity

4
问题在于你在循环中调用了两次.next():
if (id == xy.next().getId())
{
    return xy.next();
}

调用 next() 两次会使迭代器向前移动两次,这不是你想要的。你需要将下一个元素保存在一个临时变量中,像这样:

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

谢谢Brian。我接受了你的答案,因为解释得很好! :-) 我还有一个bug需要修复;感谢你的帮助! - Snow_Mac

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;

}


2

你正在连续调用.next()函数。

解决方法是仅调用一次并将其保存在变量中,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接