2011-05-06 120 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; 
     } 
    }