C'est la façon la plus populaire (il me semble) de vérifier si une valeur est dans un tableau:
for (int x : array)
{
if (x == value)
return true;
}
return false;
Cependant, dans un livre que j'ai lu il y a de nombreuses années, probablement, Wirth ou Dijkstra, il a été dit que ce style est meilleur (par rapport à une boucle while avec une sortie à l'intérieur):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
De cette façon, la condition de sortie supplémentaire devient une partie explicite de l'invariant de la boucle, il n'y a pas de conditions cachées et sort à l'intérieur de la boucle, tout est plus évident et plus d'une manière de programmation structurée. J'ai généralement préféré ce dernier modèle chaque fois que possible et for
j'ai utilisé la boucle pour parcourir uniquement de a
à b
.
Et pourtant je ne peux pas dire que la première version soit moins claire. C'est peut-être encore plus clair et plus facile à comprendre, du moins pour les très débutants. Je me pose donc toujours la question de savoir laquelle est la meilleure?
Peut-être que quelqu'un peut donner une bonne justification en faveur d'une des méthodes?
Mise à jour: Il ne s'agit pas de points de retour de fonctions multiples, de lambdas ou de trouver un élément dans un tableau en soi. Il s'agit de savoir comment écrire des boucles avec des invariants plus complexes qu'une seule inégalité.
Mise à jour: OK, je vois l'intérêt des personnes qui répondent et commentent: j'ai mélangé la boucle foreach ici, qui elle-même est déjà beaucoup plus claire et lisible qu'une boucle while. Je n'aurais pas dû faire ça. Mais c'est aussi une question intéressante, alors laissons-la telle quelle: foreach-loop et une condition supplémentaire à l'intérieur, ou une boucle while avec un invariant de boucle explicite et une post-condition après. Il semble que la boucle foreach avec une condition et une sortie / pause soit gagnante. Je vais créer une question supplémentaire sans la boucle foreach (pour une liste chaînée).
collection.contains(foo)