Ini adalah cara yang paling populer (menurut saya) untuk memeriksa apakah suatu nilai ada dalam array:
for (int x : array)
{
if (x == value)
return true;
}
return false;
Namun, dalam sebuah buku yang saya baca bertahun-tahun yang lalu oleh, mungkin, Wirth atau Dijkstra, dikatakan bahwa gaya ini lebih baik (bila dibandingkan dengan loop sementara dengan jalan keluar di dalam):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
Dengan cara ini, kondisi keluar tambahan menjadi bagian eksplisit dari invarian loop, tidak ada kondisi tersembunyi dan keluar di dalam loop, semuanya lebih jelas dan lebih dalam cara pemrograman terstruktur. Saya biasanya lebih suka pola yang terakhir ini bila memungkinkan dan menggunakan for
-loop untuk hanya beralih dari a
ke b
.
Namun saya tidak dapat mengatakan bahwa versi pertama kurang jelas. Mungkin bahkan lebih jelas dan lebih mudah dipahami, setidaknya untuk pemula. Jadi saya masih bertanya pada diri sendiri pertanyaan mana yang lebih baik?
Mungkin seseorang dapat memberikan alasan yang bagus untuk mendukung salah satu metode?
Pembaruan: Ini bukan pertanyaan tentang beberapa titik pengembalian fungsi, lambdas atau menemukan elemen dalam array per se. Ini tentang bagaimana menulis loop dengan invarian yang lebih kompleks daripada ketidaksetaraan tunggal.
Pembaruan: OK, saya melihat inti dari orang-orang yang menjawab dan berkomentar: Saya mencampur-adukkan dalam loop foreach di sini, yang itu sendiri sudah jauh lebih jelas dan mudah dibaca daripada loop-sementara. Seharusnya aku tidak melakukan itu. Tapi ini juga pertanyaan yang menarik, jadi mari kita biarkan apa adanya: foreach-loop dan kondisi tambahan di dalam, atau loop-sementara dengan invarian loop eksplisit dan setelah kondisi setelah. Tampaknya foreach-loop dengan kondisi dan jalan keluar / istirahat menang. Saya akan membuat pertanyaan tambahan tanpa foreach-loop (untuk daftar tertaut).
collection.contains(foo)