2009-09-04 9 views
45

Est-ce qu'une boucle java for-each garantit que les éléments seront présentés dans l'ordre s'ils sont invoqués dans une liste? Dans mes tests, il ne semble, mais je ne peux pas sembler trouver ce explicitement mentionné dans tous les documentsBoucle Java For-Each: Ordre de tri

List<Integer> myList;// [1,2,3,4] 
for (Integer i : myList) { 
    System.out.println(i.intValue()); 
} 

#output 
1,2,3,4 

Répondre

46

Oui. La boucle foreach parcourt la liste dans l'ordre indiqué par la méthode iterator(). Voir le documentation for the Iterable interface.

Si vous regardez le Javadoc for List vous pouvez voir qu'une liste est une "collection ordonnée" et que la méthode iterator() renvoie un itérateur qui itère "dans la bonne séquence".

3

Vous pouvez utiliser une boucle for, a la for (int i = 0; i < myList.length(); i++) si vous voulez le faire d'une manière ordonnée. Cependant, autant que je sache, chacun devrait le faire dans l'ordre.

+0

ouais mais c'est vraiment moche, je serais plutôt sûr de pour-chaque – Mike

15

La boucle foreach utilisera le iterator intégré dans le Collection, de sorte que l'ordre d'obtenir des résultats en dépendra si oui ou non la Collection maintient une sorte d'ordre aux éléments. Donc, si vous bouclez un ArrayList, vous obtiendrez les éléments dans l'ordre dans lequel ils ont été insérés (en supposant que vous n'ayez pas trié ArrayList). Si vous bouclez un HashSet, tous les paris sont désactivés, puisque les HashSets ne maintiennent aucun ordre.

Si vous devez garantir une commande aux éléments de la collection, définissez un Comparator qui établit cet ordre et utilisez Collections.sort(Collection<T>, Comparator<? super T>).

10

Oui, les spécifications du langage Java assurez-vous que

for (Iterator<Whatever> i = c.iterator(); i.hasNext();) 
    whatEver(i.next()); 

est équivalent à

for (Whatever x : c) 
    whatEver(x); 

pas "changement de commande" est autorisée.

Questions connexes