2015-11-10 84 views
2

我試圖做一個foreach循環作爲遵循一個LinkedList式的I類建:迭代器執行造成死循環

boolean contains = false; 
for(Thing t : front) { 
    if(t.equals(something)) { 
     t.doSomething(); 
     contains = true; 
     break; 
    } 
} 

這是迭代方法,我已經實現了:

@Override 
public Iterator<Thing> iterator() { 
    Thing current = this; 
    return new Iterator<Thing>() { 
     public boolean hasNext() { 
      return current.hasNext(); 
     } 

     public Thing next() { 
      return current.next; 
     } 
    }; 
} 

我試過調試這個,它似乎沒有返回鏈表中的下一個元素,因此當我運行它並嘗試執行foreach循環時導致無限循環。

對不起,如果這個問題已被回答,或者有一個非常愚蠢的錯誤,我搜索了一段時間,找不到答案。這是我第一次寫一個迭代器,所以請溫和。 :)

回答

6

你必須推進next()Iterator的狀態:

public Thing next() { 
     current = current.next; 
     return current; 
    } 

否則,next()所有通話將返回相同的元素。

編輯:

你應該將你的局部變量聲明Thing current = this;您的匿名類實例內(即把它變成一個實例變量)。

@Override 
public Iterator<Thing> iterator() { 
    return new Iterator<Thing>() { 

     private Thing current = Thing.this; 

     public boolean hasNext() { 
      return current.hasNext(); 
     } 

     public Thing next() { 
      current = current.next; 
      return current; 
     } 

    }; 
} 
+0

當我這樣做時,在Eclipse中出現錯誤:「在封閉範圍內定義的局部變量當前必須是最終的或有效的最終結果」。 我試着改變下面的方法: public Thing next(){ \t Thing tmp = current; \t tmp = current.next; \t return tmp; } 但它仍然沒有前進到列表中的下一個元素。 – Tbs95

+0

@ Tbs95方法中的匿名類對封閉方法內的變量沒有更改權限。您需要將'current'變量作爲'Iterator'的實例變量,因爲它是迭代器狀態的一部分。 – khelwood

+0

謝謝@Eran,但現在我已經更改了變量聲明位置,我得到一個類型不匹配錯誤,將新的迭代器(){}轉換爲Thing。 – Tbs95