Java de la boucle foreach préserver l'ordre?
Java de la boucle foreach, à commencer par la première de l'objet et de façon linéaire, c'est à la fin? Par exemple
String[] names = new String[] {"Zoe", "Bob", "Charlie", "Alex"};
for(String name : names) {
//do stuff...
}
Est la chaîne de caractères "Zoé", toujours traitée en premier, suivi par "Bob", etc? Pas de tri qui se passe? Je l'ai testé moi-même et n'ai pas trouvé de tout, mais j'ai besoin d'une garantie et ne pouvait pas trouver quelque chose dans les docs.
- réponse courte: oui, pour les tableaux, il ne. (un peu) plus longue réponse: cela dépend de l'objet que vous itérer sur
- que diriez -
String
s? - Question: pourquoi le tri (ou de toute autre modification) être appliquée que par l'aide d'une boucle (peu importe si vous l'utiliser foreach ou un itérateur directement)?
- Peut-être que mon commentaire était trompeuse: Pour TOUS les tableaux (et arraylists) l'ordre est conservé intact. Pour les autres listes/jeux cela pourrait ne pas être vrai!
- Pour un ordre récipient, tel qu'un tableau ou une liste, les éléments seront répétées dans le conteneur de l'ordre spécifié.
- Je n'ai pas tellement dire "changer l'ordre" que dans, ne itérer sur eux dans l'ordre? Par exemple, il ne serait pas sauter de 0,2,1,3...
- et Teo, je n'ai jamais prétendu qu'ils ont fait. Je voulais parler de processus de commande, pas l'ordre de tri.
- il pourrait faire si vous êtes une itération sur une collection comme une
HashMap
, pour lequel l'itération de l'ordre n'est pas (nécessairement) de l'ordre d'insertion. - Reste la question contient: pourquoi itération est pas dans l'ordre prévu par la collection/ensemble? Comme d'autres l'ont déjà répondu à l'itération peut être déterminée par la collection (ou plus précisément son itérateur), mais il ne serait pas logique pour une boucle juste "jump around", tout juste de l'itération. Que de casser beaucoup de logique et n'entraînerait pas de code fiable.
For other lists ... this might not be true!
vous avez raison, il pourrait ne pas être vrai, mais la définition d'une liste contient un certain/déterministe de l'ordre donc, si ce n'est pas vrai pour une certaine liste je préfère ne pas appeler cela une liste. 🙂
Vous devez vous connecter pour publier un commentaire.
Oui. L'ordre n'est pas modifié. Cela s'applique à tous les types de collections de la Java Cadre De Collecte la mise en œuvre de la l'interface iterator qui est utilisé par la boucle for. Si vous souhaitez trier votre Tableau, vous pouvez utiliser Les tableaux de.de tri(noms)
forEach
changement pour les cours d'eau - dans ce cas, si vous voulez vous assurer de la commande, vous souhaitez utiliserforEachOrdered
Le renforcement de la
for
boucle est spécifié dans JLS 14.14.2, où son équivalent en code est écrit.Il peut être utilisé pour de la boucle sur les tableaux et les instances de
Iterable
.Pour un tableau, l'ordre d'itération sera toujours préservée et être cohérente entre les pistes. C'est parce qu'il est équivalent à un simple
for
boucle, avec un indice allant du début du tableau à sa fin.Pour un
Iterable
, il suivra l'ordre de l'correspondantIterator
(extrait en appelantItératif.iterator()
), qui peuvent ou peuvent ne pas être cohérentes entre les courses.Vous devez vous référer à la Javadoc de chaque type pour voir si une commande est conforme ou pas. Par exemple, il est expressément spécifié que pour
List
, l'itérateur conserve l'ordre:Tout il est expressément spécifié que pour
Set
, la commande n'est pas spécifiée (à moins qu'une garantie supplémentaire est faite):