2011-05-06 100 views
3

所以我正在研究一个涉及两种数据类型的程序:一个链表和一个Arraylist。Java:迭代器

链表迭代器看起来像:

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(实例变量)来得到我的对象,它总是抓起NEXT对象,而不是我想要的对象。如何使用链接列表和数组列表获取当前对象?

请帮帮我!

回答

4

的问题是,你打电话的.next():

的解决方案只能用一次调用它并将其保存在一个变量这样

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

调用next()两次会提前两次迭代器,这不是你想要的。您需要将临时变量保存为如下形式:

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

谢谢Brian。我已经接受了你的回答,好的赎罪! :-)我有这个错误,其他地方,这是我正在修复;谢谢你的帮助! – 2011-05-06 03:46:59

6

两次使用next()方法,这可能是为什么。

通过调用

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

return xy.next(); 

你实际上递增尝试使用它递增迭代器的next()方法,所以这个

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

您可能还想提及可以防止问题的for(StudentIF student:xy)语法。好答案。 – ditkin 2011-05-06 03:03:30

+1

@ditkin ...不应该他实现Iterable接口才能做到这一点? – insumity 2011-05-06 03:04:45

3

每次迭代器。

你最好的赌注是存储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; 
     } 
    }