2009-06-12 3 views
2

Quelqu'un pourrait-il me donner un exemple de la meilleure façon d'ajouter un itérateur à une interface itérative de la classe pré Java 5?Exemples d'ajout d'un itérateur à une classe personnalisée dans Java 1.4?

Est-ce que l'emballage d'une collection serait la meilleure option? Quelque chose comme

public Iterator iterator() { 
    return wrappedCollection.iterator(); 
} 

Dans mon message initial j'ai confondu Iterator avec Iterable. Le résultat final qui m'intéresse est de pouvoir opérer sur la classe personnalisée avec ce qui suit.

Iterator it = customClass.iterator(); 
while (it.hasNext()) { 
    //do stuff 
} 
+0

C'était un de mes moments, désolé. J'aurais dû me donner quelques minutes de plus avant de poster cette question. Merci à tous ceux qui ont essayé de m'aider. –

Répondre

4

Si vous ne faites qu'emballer une collection, vous pouvez utiliser une méthode de transfert.

public class Custom implements Collection { 
    Collection c; // create an instance here or in the constructor 
    ... 

    // forwarding method 
    public Iterator iterator() 
    { 
     return c.iterator(); 
    } 
} 

Je pense qu'il serait préférable de mettre en œuvre tout type d'interface Collection vous envelopper, mais, au lieu de Iterator.

+0

Pourquoi implémenter Iterator? –

+0

@mmyers: La question originale (maintenant éditée) m'a conduit dans cette direction. Je ne pense pas que ce soit une bonne idée, comme je l'ai dit dans le montage que je faisais pendant que vous écriviez votre commentaire. –

+0

Oui, j'ai lu la question originale. J'aurais juste commencé la réponse en disant ce que vous avez dit dans votre édition (afin que les gens ne le comprennent pas mal). :) –

4

Avez-vous ajouté une méthode qui ressemble à

public Iterator iterator() { 
    return new YourCustomIterator(...); 
} 

?

+0

Ou simplement 'return this 'si son objet implémente Iterator. –

+0

Oh, ouais bon, l'interface Iterator est pour l'itérateur lui-même. J'étais tellement concentré sur la recréation de l'itération que je me suis confus. –

+1

Mais en y réfléchissant, vous ne voulez vraiment pas que votre collection soit l'itérateur. Ensuite, cela ne fonctionnerait que la première fois que vous l'avez parcouru. –

1

Il semble que vous venez d'ajouter ces méthodes à votre classe qui contient la collection. Dans ce cas, votre objet est maintenant votre itérateur. Ce que vous avez probablement voulu faire est de créer une nouvelle classe qui implémente Iterator et est instanciée avec un clone de votre collection via une méthode iterator().

1

Si vous voulez juste exposer l'itérateur d'une collection interne, vous venez de retourner cet itérateur de collections. Si vous voulez faire plus que cela, vous devez soit envelopper le vôtre, soit jeter un coup d'œil sur le paquet Apache Commons Collections qui comprend un certain nombre de méthodes d'itérateur et de modificateur. (Même si vous ne pouvez pas utiliser leurs méthodes, leurs implémentations devraient vous apprendre beaucoup sur la construction d'itérateurs.)

1

Vous voulez que la collection possède une méthode d'itérateur qui renvoie une instance d'une classe Iterator privée si nécessaire.

public class IterableTest 
{ 
    public Iterator iterator() 
    { 
     return new IteratorTest(); 
    } 
    private class IteratorTest implements Iterator 
    { 
     public boolean hasNext(){...} 

     public Object next(){...} 

     public void remove(){...} 
    } 
} 
+0

Iterable est Java 5 ou version ultérieure. –

+0

Point pris. Mais l'idée de la classe interne reste. –

Questions connexes