Itérables en Java
Par Michel Billaud, samedi 28 juillet 2012 à 18:44 :: Bidouilles :: #70 :: rss
Je cherchais un exemple simple pour montrer comment parcourir un objet en Java, à l'aide du fameux "foreach" ajouté en Java 1.6 (je crois). J'ai trouvé des exemples pas simples, alors voila.
Java 1.6 a ajouté, à la boucle for tradtionnelle, une boucle "foreach" qui permet de parcourir un objet "conteneur", élément par élément. En fait "foreach" s'écrit "for", plus exactement :
for ( type nom-de-variable : objet ) { ....}
mais bon, on l'appelle quand même foreach....
Je prends l'exemple des intervalles. Ils sont définis par une paire de valeurs (min et max), et quand on les parcourt, on doit récupérer successivement min, min+1, .... jusqu'à max.
Utilisation On initialisera un intervalle en faisant
Intervalle fourchette = new Intervalle(1,10);
et ensuite on pourra le parcourir
for (int i : fourchette) {
System.out.println("i=" + i);
}
Réalisation :
Globalement, la classe Intervalle se présente comme suit
public class Intervalle implements Iterable<Integer> {
int min, max;
public Intervalle(int aMin, int aMax) {
min = aMin;
max = aMax;
}
@Override
public Iterator<Integer> iterator() {
// plus de détails, plus loin ....
}
}
On déclare qu'elle est itérable, c'est-à-dire que ses instances peuvent être parcourues par un for( : ).
Au passage, on précise aussi que le parcours égrène des @Integer@.
Remarquez que la variable de contrôle de ma boucle for est de type int, mais Java se débrouille pour faire les conversions int <-> Integer.
Du coup, la classe Intervalle doit être équipée d'une méthode iterator qui renvoie un itérateur susceptible de fournir des Integer. C'est logique.
Zoom sur la méthode iterator :
public Iterator<Integer> iterator() {
return new Iterator() {
int valeurCourante = min;
@Override
public boolean hasNext() {
return (valeurCourante <= max);
}
@Override
public Integer next() {
Integer v = valeurCourante++;
return v;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
};
Pour faire simple (?), la méthode renvoie un itérateur d'une classe anonyme, avec
- une variable
valeurCourantequi donne la valeur courante de l'itérateur (au début, la première valeur de l'intervalle) - une méthode
hasNext()pour savoir si il reste des valeurs non "consommées" dans l'intervalle next()qui renvoie la valeur courante, et la fait avancer.- ici, on ne se sert pas de
remove(), qui permet de « supprimer de la collection sous-jacente à un itérateur la dernière valeur retournée parnext(), » la doc dixit. On n'a envie de supprimer des éléments d'un intervalle, donc pas besoin dans cet exemple.
Et bien voila, il n'y a plus qu'à partir en vacances.
Commentaires
1. Le mardi 14 août 2012 à 10:20, par Michel Billaud
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.