Comment écrire Itérateur sur une liste?
J'ai une classe de mise en œuvre de la Liste de l'interface et de stocker des données dans un tableau d'Objets. Maintenant, j'ai besoin d'écrire Itérateur méthode de ma classe. Comment commencer ? J'ai pensé à écrire une sous-classe implémentant l'interface Iterator. Objet de la classe auront des paramètres de l'index en cours et le dernier indice. Lors de chaque appel à next/hasNext ces paramètres seront modifiés. Cette approche est-elle correcte ? Mais ensuite, il y a un problème avec la méthode remove (), car elle devrait permettre de supprimer un objet de la classe d'appeler mon itérateur. Comment résoudre ce problème ? Aussi ce qui devrait arriver dans iterator() la méthode de ma classe principale ?
Mon pseudo:
class MyCollection<T> implements List<T>{
T[] tab;
MyCollection(int len) {
tab = (T[])new Object[len];
}
public Iterator iterator(){
}
}
class MyIterator<T> implements Iterator {
private int current;
private int last;
public void remove(){
}
public T next(){
}
public boolean hasNext(){
}
}
Vous devez vous connecter pour publier un commentaire.
On dirait que vous êtes de réimplanter
ArrayList
. Est-il une bonne raison pour faire cela?Vous devriez seulement besoin d'un indice, je pense. Mais l'idée de base est correcte.
Il y a deux approches:
Supprimer l'élément du tableau et en quelque sorte de faire en sorte que le "trou" est rempli. A) copie de tous les éléments d'un nouveau tableau de taille
tab.length - 1
, b) l'utilisationSystem.arraycopy
ou équivalent pour déplacer les éléments à partir de l'élément supprimé, ou c) affecter la valeur null à la fente et de modifier les classes de sauter par-dessusnull
éléments. (Le dernier est probablement une très mauvaise idée ...)Ont
MyIterator.remove()
jeter unUnsupportedOperationException
. Leremove
méthode est une méthode facultative selon laIterator
API spec.Il doit créer et retourner une instance de la MyIterator classe.
Prendre un coup d'oeil à java.util.ArrayList.
Comment au sujet de l'extension java.util.AbstractList? Après tout c'est ce que tout le soleil de la Liste des implémentations dans
java.util
(mais pas dansjava.util.simultanées
) n'.De cette façon, vous avez seulement besoin de mettre en œuvre
Vous obtenez toutes les autres méthodes (y compris iterator()) pour gratuit.