Le parcours d’un tableau se fait à l’aide d’un incrément
for(int i=0;i<=t.length;i=i+1) {
/* someting about t[i] */
}
Le parcours d’une liste chaînée se fait à l’aide d’une référence vers la cellule courante
for(Cell<T> c=list;c != null;c=c.suivant) {
/* something about c.valeur */
}
Pour pouvoir parcourir de la même manière des listes chaînées et des tableaux (et plus généralement toute objet représentant une suite ordonnée d’éléments), on utilisateur un Iterator
avec les méthodes suivantes :
hasNext()
retourne true
s’il y a encore des éléments à parcourirnext()
retourne le prochain élément parcouru et avance au prochain élément ; cette méthode sert donc à la fois à récupérer le prochain élément et à avancer dans le collectionLe parcours à l’aide d’un itérateur (obtenu en général à partir d’une méthode iterator()
sur l’objet collection) se fait ainsi
for(Iterator<T> i = coll.iterator;i.hasNext();) {
T valeur = i.next();
/* something about valeur */
}
Remarque : il est obligatoire de stocker la valeur de retour de la méthode next()
dans une variable si l’on veut utiliser cette valeur plusieurs fois au risque d’avancer de deux éléments à chaque itération de la boucle.
Exemple : calcul et affichage
int sum=0;
for(Iterator<Integer> i = list.iterator();i.hasNext();) {
int v = i.next();
sum+=v;
System.out.println(v);
}
System.out.println(sum);
Note : la parcours à l’aide du foreach est compilé de la même manière que la boucle ci-dessus.
On souhaite fréquemment retirer des éléments d’une collection pendant son parcours (par exemple, retirer les chaînes vides d’une liste de String
)
Il est interdit de modifier la collection avec ses méthodes pendant son parcourt sous peine d’avoir au mieux une exception ConcurrentModificationException
et au pire un état instable de la collection.
La seule chose autorisée est d’appeler la méthode remove()
de l’itérateur qui enlève la dernière valeur retirée.
Exemple
for(Iterator<String> i = list.iterator();i.hasNext();) {
String s = i.next();
if (s.equals(""))
i.remove();
}