Esta é a maneira mais popular (me parece) de verificar se um valor está em uma matriz:
for (int x : array)
{
if (x == value)
return true;
}
return false;
No entanto, em um livro que li há muitos anos por, provavelmente, Wirth ou Dijkstra, foi dito que esse estilo é melhor (quando comparado a um loop while com uma saída interna):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
Dessa forma, a condição de saída adicional se torna uma parte explícita do invariante do loop, não há condições ocultas e sai dentro do loop, tudo é mais óbvio e mais de uma maneira de programação estruturada. Eu geralmente preferia esse último padrão sempre que possível e usei o for
loop para iterar apenas de a
para b
.
E, no entanto, não posso dizer que a primeira versão seja menos clara. Talvez seja ainda mais claro e fácil de entender, pelo menos para iniciantes. Então, eu ainda estou me perguntando qual é o melhor?
Talvez alguém possa dar uma boa justificativa em favor de um dos métodos?
Atualização: Não se trata de pontos de retorno de múltiplas funções, lambdas ou localização de um elemento em uma matriz em si. É sobre como escrever loops com invariantes mais complexos do que uma única desigualdade.
Atualização: OK, eu vejo o ponto das pessoas que respondem e comentam: eu misturei o loop foreach aqui, que já é muito mais claro e legível do que um loop while. Eu não deveria ter feito isso. Mas essa também é uma pergunta interessante, então vamos deixar como está: loop foreach e uma condição extra por dentro, ou um loop while com um loop explícito invariável e uma pós-condição depois. Parece que o loop foreach com uma condição e uma saída / interrupção está vencendo. Vou criar uma pergunta adicional sem o loop foreach (para uma lista vinculada).
collection.contains(foo)