Đây là cách phổ biến nhất (dường như đối với tôi) để kiểm tra xem một giá trị có nằm trong một mảng không:
for (int x : array)
{
if (x == value)
return true;
}
return false;
Tuy nhiên, trong một cuốn sách tôi đã đọc cách đây nhiều năm, có lẽ, Wirth hoặc Dijkstra, người ta nói rằng phong cách này tốt hơn (khi so sánh với một vòng lặp trong khi có lối ra bên trong):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
Bằng cách này, điều kiện thoát bổ sung trở thành một phần rõ ràng của bất biến vòng lặp, không có điều kiện ẩn và thoát bên trong vòng lặp, mọi thứ rõ ràng hơn và nhiều hơn theo cách lập trình có cấu trúc. Tôi thường thích mẫu sau này bất cứ khi nào có thể và sử dụng for
-loop để chỉ lặp từ a
đến b
.
Nhưng tôi không thể nói rằng phiên bản đầu tiên ít rõ ràng hơn. Có lẽ nó thậm chí còn rõ ràng và dễ hiểu hơn, ít nhất là cho những người mới bắt đầu. Vì vậy, tôi vẫn đang tự hỏi mình câu hỏi cái nào tốt hơn?
Có lẽ ai đó có thể đưa ra một lý do tốt để ủng hộ một trong những phương pháp?
Cập nhật: Đây không phải là câu hỏi về nhiều điểm trả về hàm, lambdas hoặc tìm một phần tử trong một mảng mỗi se. Đó là về cách viết các vòng lặp với các bất biến phức tạp hơn bất đẳng thức đơn lẻ.
Cập nhật: OK, tôi thấy quan điểm của những người trả lời và nhận xét: Tôi đã trộn lẫn trong vòng lặp foreach ở đây, bản thân nó đã rõ ràng và dễ đọc hơn nhiều so với vòng lặp while. Tôi không nên làm điều đó. Nhưng đây cũng là một câu hỏi thú vị, vì vậy hãy để nó như vậy: vòng lặp foreach và một điều kiện bổ sung bên trong, hoặc vòng lặp while với bất biến vòng lặp rõ ràng và điều kiện hậu sau. Có vẻ như vòng lặp foreach với một điều kiện và thoát / ngắt là chiến thắng. Tôi sẽ tạo một câu hỏi bổ sung mà không có vòng lặp foreach (cho danh sách được liên kết).
collection.contains(foo)