Questo è il modo più popolare (mi sembra) di verificare se un valore è in un array:
for (int x : array)
{
if (x == value)
return true;
}
return false;
Tuttavia, in un libro che ho letto molti anni fa di, probabilmente, Wirth o Dijkstra, è stato detto che questo stile è migliore (rispetto a un ciclo di loop con un'uscita all'interno):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
In questo modo la condizione di uscita aggiuntiva diventa una parte esplicita dell'invariante del ciclo, non ci sono condizioni nascoste ed esce all'interno del ciclo, tutto è più ovvio e più in un modo di programmazione strutturata. In genere ho preferito questo secondo schema ogni volta che era possibile e for
ho usato il -loop per iterare solo da a
a b
.
Eppure non posso dire che la prima versione sia meno chiara. Forse è ancora più chiaro e più facile da capire, almeno per i principianti. Quindi mi sto ancora ponendo la domanda su quale sia la migliore?
Forse qualcuno può dare una buona logica a favore di uno dei metodi?
Aggiornamento: questa non è una questione di punti di ritorno a funzioni multiple, lambda o trovare un elemento in un array di per sé. Riguarda come scrivere loop con invarianti più complessi di una singola disuguaglianza.
Aggiornamento: OK, vedo il punto delle persone che rispondono e commentano: ho inserito qui il ciclo foreach, che di per sé è già molto più chiaro e leggibile di un ciclo while. Non avrei dovuto farlo. Ma questa è anche una domanda interessante, quindi lasciamola così com'è: foreach-loop e una condizione extra all'interno, o un ciclo while con un invariante loop esplicito e una post-condizione dopo. Sembra che il ciclo foreach con una condizione e un'uscita / interruzione stia vincendo. Creerò una domanda aggiuntiva senza il ciclo foreach (per un elenco collegato).
collection.contains(foo)