2016-11-17 68 views
-1

要打印出來,從我LinkedList用iterator對象,但第一個對象不會被打印出來,所以從第二個開始:如何使用Iterator從LinkedList打印第一個對象?

Car car1 = new Car("Koenigsegg CCXR Trevita", "BASASS1"); 
Car car2 = new Car("Lamborghini Veneno", "B1T3M3"); 
Car car3 = new Car("W Motors Lykan Hypersport", "NUMERO1"); 

public void addToList() { 

    availableCarList.add(car1); 
    availableCarList.add(car2); 
    availableCarList.add(car3); 

    System.out.print("Original contents of list: "); 

    IIterator itr = availableCarList.getIterator(); 

    while(itr.hasNext()) { 
     Object element = itr.next(); 
     System.out.print(element + " "); 
    } 

    System.out.println(); 
} 

結果:

result

什麼我做錯了嗎?

hasNext()和next()在LinkedList類中實現:

private class Iterator<T> implements IIterator<T> 
{ 

    private LinearNode<T> temp; 
    public Iterator() 
    { 
     temp = (LinearNode<T>) front; 
    } 

    @Override 
    public boolean hasNext() 
    { 
     return (temp.getNext() != null); 
    } 

    @Override 
    public T next() 
    { 
     if (temp == null) 
     { 
      throw new IllegalStateException(); 
     } 

     temp = temp.getNext(); 
     return temp.getElement(); 
    } 
} 
+3

您需要提供'IIterator'的定義,大概是你的'LinkedList'類,因爲'java.util.LinkedList'不會返回'IIterato r'。 –

+0

或者只是用'Iterator'代替它 – Tibrogargan

+2

如果你一直在使用'java.util.LinkedList'(和'iterator()'方法和返回的'java.util.Iterator'),[你的循環會打印出第一個元素](http://ideone.com/kw2VK5)。您的列表和/或迭代器的實現存在問題。 –

回答

2

首先,你的代碼表明我們認爲,LinkedList實際上是自己的類 ...不是標準LinkedList

用名稱與標準庫類相同(簡稱)命名類是一個非常糟糕的主意。它讓讀者感到困惑......如果你在3個月以上的時間裏看過你的代碼,這將包括你自己。

實際問題很可能是您的列表迭代器的實現不正確。它看起來像你在跳過列表中的第一個元素。

考慮什麼temp包含,我認爲:

  1. hasNext()方法應該測試temp,不temp.getNext()
  2. next()方法應該返回temp.getElement(),不temp.getNext().getElement()
+0

如果我喜歡你的建議,我會持續地獲得第一個對象,不要切換到下一個對象。 –

+0

然後你還沒有理解我的建議。基於新的症狀,您現在不能正確推進迭代器。請注意,我的答案沒有提到如何推進迭代器。 (我假設你會考慮我說的*而不是將我的答案當作複製和粘貼解決方案,而不是......) –