यह जाँच का सबसे लोकप्रिय तरीका है (यह मुझे लगता है) कि क्या कोई ऐरे में है:
for (int x : array)
{
if (x == value)
return true;
}
return false;
हालांकि, एक किताब में मैंने कई साल पहले, शायद, Wirth या Dijkstra द्वारा पढ़ा है, यह कहा गया था कि यह शैली बेहतर है (जब अंदर बाहर निकलने के साथ थोड़ी देर की तुलना में):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
इस तरह अतिरिक्त निकास स्थिति लूप इनवेरिएंट का एक स्पष्ट हिस्सा बन जाती है, कोई छिपी हुई स्थिति नहीं होती है और लूप के अंदर से बाहर निकल जाती है, सब कुछ अधिक स्पष्ट और संरचित-प्रोग्रामिंग तरीके से अधिक होता है। मैं आम तौर पर इस बाद पैटर्न जब भी संभव पसंद किया और इस्तेमाल किया for
से केवल पुनरावृति को -loop a
लिए b
।
और फिर भी मैं यह नहीं कह सकता कि पहला संस्करण कम स्पष्ट है। शायद यह और भी स्पष्ट और आसान है, कम से कम बहुत शुरुआती लोगों के लिए। इसलिए मैं अभी भी अपने आप से सवाल पूछ रहा हूं कौन सा बेहतर है?
हो सकता है कि कोई एक तरीके के पक्ष में एक अच्छा तर्क दे सकता है?
अद्यतन: यह एकाधिक फ़ंक्शन रिटर्न पॉइंट्स, लैम्ब्डा या एरे में किसी तत्व को खोजने का प्रश्न नहीं है। यह एक असमानता की तुलना में अधिक जटिल आक्रमणकारियों के साथ लूप लिखने के बारे में है।
अपडेट: ठीक है, मैं उन लोगों के बिंदु को देखता हूं जो जवाब देते हैं और टिप्पणी करते हैं: मैं यहां मिश्रित फॉर्च लूप में हूं, जो खुद ही पहले से ही अधिक स्पष्ट है और थोड़ी देर के लूप से पढ़ने योग्य है। मुझे ऐसा नहीं करना चाहिए था। लेकिन यह भी एक दिलचस्प सवाल है, तो चलो इसे छोड़ दें जैसा कि यह है: फॉरच-लूप और अंदर एक अतिरिक्त स्थिति, या एक स्पष्ट लूप इनवेरिएंट के साथ एक लूप और बाद की स्थिति। ऐसा लगता है कि एक शर्त के साथ फॉर्च-लूप और एक निकास / ब्रेक जीत रहा है। मैं फ़ॉरच-लूप (लिंक्ड सूची के लिए) के बिना एक अतिरिक्त प्रश्न बनाऊंगा।
collection.contains(foo)