Itération sur les listes

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 :

Le 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.

Altération de la collection pendant son parcourt

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();
}