2010-03-28 43 views
2

所以我有一個Tree<E>類,其中E是由樹保存和組織的數據類型。我想像這樣遍歷Tree,或者以類似於此的方式:Java迭代器 - 試圖讓每個循環工作

1. Tree<String> tree=new Tree<String>(); 
2. ...add some nodes... 
3. for (String s : tree) 
4.  System.out.println(s); 

雖然它給了我一個第3行的錯誤。

Incompatible types 
    required: java.lang.String 
    found: java.lang.Object  

而下面的工作正常,並符合市場預期,進行樹的適當的中序遍歷並打印每一個節點出理所應當:

for (TreeIterator<String> i = tree.iterator(); i.hasNext();) 
    System.out.println(i.next()); 


我的樹類看起來是這樣的:

public class Tree<E> implements java.lang.Iterable{ 
    ... 
    public TreeIterator<E> iterator(){ 
     return new TreeIterator<E>(root);//return an iterator for the root node 
    } 
    .... 
} 


而我TreeIterator類看起來是這樣的:

public class TreeIterator<E> implements java.util.Iterator<E>{ 
    public E next(){ 
     ... 
    } 
    ... 
} 

但我想讓for (String s : tree)循環正常工作 - 任何想法?整個過程就是爲我的程序設置一個乾淨的foreach循環,而不是使用那個醜陋的循環。

任何想法我做錯了什麼?


編輯

按(這是後不久發佈和another equally good answer)的best answer,下面做它的工作:

更改

public class Tree<E> implements java.lang.Iterable{ 
    .... 
} 

public class Tree<E> implements java.lang.Iterable<E>{ 
    .... 
} 

......謝謝你們!

+0

你的錯誤是你的迭代器返回一個'Object'而不是'String'。 – 2010-03-28 18:35:35

+0

注:我已經添加了一些額外的代碼。 另外,@Jordan:我的迭代器是否意味着next()函數?現在,當我嘗試改變next()從返回一個E返回一個Object時,它給了我一個錯誤,並說要將它改回來。 – 2010-03-28 18:40:28

回答

5

foreach循環應該如果您Tree<E>類工作正常還實現了Iterable<E>接口。您需要確保您的迭代器還返回通用類型E

+0

哦 - 對!這是有道理的,這就是爲什麼它要求一個「對象」;因爲現在我的'樹'類基本上正在實現'Iterable '! – 2010-03-28 18:45:44

4

Tree必須實現Iterable<E>如果你想讓它與工作在一個通用的方式,每個迴路(因此你iterator()方法必須返回Iterator<E>

0

的在代碼循環你粘貼:

3.(字符串S:樹)

被錯誤類型轉換樹數據結構的元素的字符串的集合(或陣列)。

我懷疑它應該是這個樣子:

for (String s : tree.getNodes()){...} 

凡getNodes返回字符串的集合。

雖然可以肯定地說,直到你粘貼更多的代碼。

+0

每次next()被調用時,迭代器都不會返回一個String(或任何E碰巧是)。雖然謝謝! – 2010-03-28 18:42:55