40 votes

Itérer avec une boucle for ou une boucle while?

Je vois souvent des code comme:

Iterator i = list.iterator();
while(i.hasNext()) {
    ...
}

mais j'écris (lors de Java 1.5 n'est pas disponible ou pour chaque ne peut pas être utilisé) comme:

for(Iterator i = list.iterator(); i.hasNext(); ) {
    ...
}

parce que

  • Il est plus court
  • Il garde le je dans une moindre portée
  • Il réduit le risque de confusion. (Est-ce que j'ai utilisé à l'extérieur de la tout? Où est-je le déclarer?)

Je pense que le code devrait être aussi facile à comprendre que possible, de sorte que je n'ai que faire de code complexe à faire des choses complexes. Qu'en pensez-vous? Qui est le meilleur?

De: http://jamesjava.blogspot.com/2006/04/iterating.html

81voto

Lou Franco Points 48823

Je préfère la boucle for, car elle définit également la portée de l'itérateur sur la boucle for.

10voto

Jon Limjap Points 46429

Il y a des utilisations appropriées pour le moment, le pour, et le foreach constructions:

  • while - Utilisez cette option si vous l'itération et le facteur décisif pour la lecture en boucle ou pas, c'est uniquement basée sur un état. Dans cette boucle, construire, maintenir un index n'est qu'une préoccupation secondaire; tout devrait être fondée sur la condition

  • for - Utilisez cette option si vous êtes en boucle et votre principale préoccupation est l'index du tableau/collection/liste. Il est plus utile d'utiliser un de si vous êtes le plus susceptible de passer par tous les éléments de toute façon, et dans un ordre particulier (par exemple, en allant vers l'arrière dans une liste triée, par exemple).

  • foreach - Utilisez cette option si vous avez seulement besoin de passer par votre collection quel que soit l'ordre.

Évidemment, il ya des exceptions, mais c'est la règle générale j'utilise au moment de décider de les utiliser. Cela étant dit, j'ai tendance à utiliser foreach le plus souvent.

5voto

Giorgio Galante Points 230

Pourquoi ne pas utiliser la construction for-each? (Je n'ai pas utilisé Java depuis un moment, mais cela existe en C # et je suis à peu près sûr que Java 1.5 l'a aussi):

 List<String> names = new ArrayList<String>();
names.add("a");
names.add("b");
names.add("c");

for (String name : names)
    System.out.println(name.charAt(0));
 

4voto

Dima Points 19888

Je pense que la portée est le plus gros problème ici, comme vous l'avez souligné.

Dans le "tout", par exemple, l'itérateur est déclarée en dehors de la boucle, de sorte qu'il continuera d'exister après la boucle est terminée. Cela pourrait provoquer des problèmes si ce même itérateur est de nouveau utilisé à un moment plus tard. E. g. vous pouvez oublier les initialiser avant de l'utiliser dans une autre boucle.

Dans le "pour", par exemple, l'itérateur est déclaré à l'intérieur de la boucle, de sorte que sa portée est limitée à la boucle. Si vous essayez de l'utiliser après la boucle, vous obtiendrez une erreur de compilation.

2voto

Steven A. Lowe Points 40596

si vous n'utilisez qu'une seule fois l'itérateur et le jetez, la deuxième forme est préférable; sinon vous devez utiliser le premier formulaire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X