Это наиболее популярный способ (мне кажется) проверки, находится ли значение в массиве:
for (int x : array)
{
if (x == value)
return true;
}
return false;
Однако в книге, которую я читал много лет назад, вероятно, Виртом или Дейкстрой, было сказано, что этот стиль лучше (по сравнению с циклом while с выходом внутри):
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)