Dies ist die (meiner Meinung nach) beliebteste Methode , um zu überprüfen, ob ein Wert in einem Array enthalten ist:
for (int x : array)
{
if (x == value)
return true;
}
return false;
In einem Buch, das ich vor vielen Jahren wahrscheinlich von Wirth oder Dijkstra gelesen habe, hieß es jedoch, dass dieser Stil besser ist (im Vergleich zu einer while-Schleife mit einem Ausgang im Inneren):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
Auf diese Weise wird die zusätzliche Exit-Bedingung ein expliziter Bestandteil der Schleifeninvariante, es gibt keine versteckten Bedingungen und Exits innerhalb der Schleife, alles ist offensichtlicher und strukturierter. Ich bevorzuge im Allgemeinen das letztere Muster, wann immer es möglich ist, und for
benutze die -Schleife, um nur von a
bis zu iterieren b
.
Und doch kann ich nicht sagen, dass die erste Version weniger klar ist. Vielleicht ist es sogar noch klarer und verständlicher, zumindest für Anfänger. Also frage ich mich immer noch, welches besser ist?
Vielleicht kann jemand eine gute Begründung für eine der Methoden geben?
Update: Hierbei handelt es sich nicht um mehrere Funktionsrückgabepunkte, Lambdas oder das Finden eines Elements in einem Array per se. Es geht darum, Schleifen mit komplexeren Invarianten als einer einzelnen Ungleichung zu schreiben.
Update: OK, ich sehe den Punkt von Leuten, die antworten und kommentieren: Ich habe hier die foreach-Schleife eingemischt, die selbst schon viel klarer und lesbarer ist als eine while-Schleife. Ich hätte das nicht tun sollen. Aber dies ist auch eine interessante Frage, also lassen wir es wie es ist: foreach-loop und eine zusätzliche Bedingung im Inneren oder eine while-Schleife mit einer expliziten Schleifeninvariante und einer Nachbedingung danach. Es scheint, dass die foreach-Schleife mit einer Bedingung und einem Exit / Break gewinnt. Ich werde eine zusätzliche Frage ohne die foreach-Schleife erstellen (für eine verknüpfte Liste).
collection.contains(foo)