Це найпопулярніший спосіб (мені здається) перевірити, чи є значення в масиві:
for (int x : array)
{
if (x == value)
return true;
}
return false;
Однак у книзі, яку я багато років тому читав, напевно, Вірт або Дайкстра, було сказано, що цей стиль кращий (у порівнянні з циклом "час" з виходом всередину):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
Таким чином додаткова умова виходу стає явною частиною циклу інваріантної, немає прихованих умов і виходів всередині циклу, все більш очевидно і більше структуровано-програмованим способом. Я звичайно віддаю перевагу цей останній зразок , де це можливо , і використовував for
-loop тільки ітерацію від a
до b
.
І все ж не можу сказати, що перша версія менш зрозуміла. Можливо, це ще зрозуміліше і простіше зрозуміти, принаймні для самих початківців. Тож я все ще задаю собі питання, який з них краще?
Можливо, хтось може дати гарне обгрунтування на користь одного з методів?
Оновлення: це не питання множини точок повернення функції, лямбда або пошуку елемента в масиві як такої. Йдеться про те, як писати петлі зі складнішими інваріантами, ніж одна нерівність.
Оновлення: Гаразд, я бачу сенс людей, які відповідають і коментують: я тут змішав цикл foreach, який сам по собі вже набагато зрозуміліший і легший для читання, ніж цикл while. Я не повинен був цього робити. Але це також цікаве питання, тому давайте залишимо його таким, яким він є: цикл foreach та додаткова умова всередині, або цикл while з явним циклом інваріантним та пост-умовою після. Здається, виграє цикл foreach з умовою та виходом / перервою. Я створять додаткове запитання без циклу foreach (для пов'язаного списку).
collection.contains(foo)