2010-03-28 6 views
2

Donc j'ai une classe Tree<E>E est le type de données détenu et organisé par l'arbre. Je voudrais itérer l'arbre comme celui-ci, ou d'une manière similaire à ceci:Iterators Java - Essayer d'avoir un pour chaque boucle au travail

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

Il me donne une erreur sur la ligne 3 cependant.

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

Ce qui suit fonctionne cependant très bien et comme prévu, l'exécution d'un bon dans l'ordre traversal de l'arbre et l'impression de chaque noeud comme il se doit:

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


Ma classe d'arbre ressemble à ceci :

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


Et ma classe TreeIterator ressemble à ceci:

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

Mais je veux que la boucle for (String s : tree) fonctionne correctement - des idées? Le but de tout cela était de mettre en place une boucle propre foreach pour l'utiliser dans mon programme, de ne pas utiliser cette boucle moche.

Une idée de ce que je fais mal?


Modifier:

Conformément à la best answer (et another equally good answer qui a été publié peu de temps après), ce qui suit fait fonctionner:

Changer

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

à

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

... Merci les gars!

+0

Votre erreur est que votre itérateur retourne un 'Object' au lieu d'un' String'. –

+0

Note: J'ai ajouté du code supplémentaire. Aussi, @Jordan: Par mon itérateur voulez-vous dire la fonction next()? En ce moment, quand j'essaie de changer next() de retourner un E à un objet, il me donne une erreur et dit de le changer. –

Répondre

5

La boucle foreach devrait fonctionner très bien si votre Tree<E> classe implémente également l'interface Iterable<E>. Vous devez vous assurer que votre Iterator renvoie également le type générique E.

+0

Oh - c'est vrai! Cela a du sens, c'est pourquoi il demande un 'Object'; depuis maintenant ma classe 'Tree ' est fondamentalement en train d'implémenter 'Iterable '! –

4

Votre Tree doit mettre en œuvre Iterable<E> si vous voulez travailler avec la pour chaque boucle d'une manière générique (et donc votre méthode iterator() doit retourner Iterator<E>)

0

La boucle dans le code que vous avez collé:

3. pour (String s: arbre)

est typecasting à tort éléments d'arbre à une collection structure de données (ou tableau) de chaînes.

Je soupçonne que cela devrait ressembler à:

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

Où getNodes retourne une collection de chaînes.

Impossible de dire si à coup sûr, jusqu'à ce que vous collez plus de code.

+0

Non, l'itérateur ne retourne qu'une seule chaîne (ou tout ce qui se produit E) chaque fois que next() est appelé. Merci quand même! –