जावा भाषा में कुछ नया होने के नाते मैं खुद को उन सभी तरीकों (या कम से कम गैर-पैथोलॉजिकल लोगों) से परिचित करने की कोशिश कर रहा हूं जो किसी सूची (या शायद अन्य संग्रह) और प्रत्येक के फायदे या नुकसान के माध्यम से पुनरावृत्त हो सकते हैं।
किसी List<E> list
वस्तु को देखते हुए , मुझे सभी तत्वों के माध्यम से लूप करने के निम्नलिखित तरीकों के बारे में पता है:
लूप के लिए बुनियादी (बेशक, वहाँ बराबर / छोरों के रूप में अच्छी तरह से कर रहे हैं)while
do while
// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list
// ...
}
नोट: जैसा कि @amarseillan ने बताया, यह फ़ॉर्म List
s पर पुनरावृत्ति करने के लिए एक खराब विकल्प है , क्योंकि get
विधि का वास्तविक कार्यान्वयन किसी का उपयोग करते समय उतना कुशल नहीं हो सकता है Iterator
। उदाहरण के लिए, LinkedList
कार्यान्वयन से पहले होने वाले सभी तत्वों को आई-वें तत्व को प्राप्त करना होगा।
उपरोक्त उदाहरण में List
भविष्य के पुनरावृत्तियों को अधिक कुशल बनाने के लिए "अपनी जगह को बचाने" के कार्यान्वयन के लिए कोई रास्ता नहीं है । इसके लिए ArrayList
यह वास्तव में मायने नहीं रखता है, क्योंकि जटिलता / लागत get
निरंतर समय (O (1)) है, जबकि एक के LinkedList
लिए यह सूची के आकार (O (n)) के समानुपाती है।
अंतर्निहित Collections
कार्यान्वयन की कम्प्यूटेशनल जटिलता के बारे में अधिक जानकारी के लिए , इस प्रश्न को देखें ।
लूप के लिए बढ़ाया ( इस प्रश्न में अच्छी तरह से समझाया गया है )
for (E element : list) {
// 1 - can call methods of element
// ...
}
इटरेटर
for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// ...
}
ListIterator
for (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// 3 - can use iter.add(...) to insert a new element into the list
// between element and iter->next()
// 4 - can use iter.set(...) to replace the current element
// ...
}
कार्यात्मक जावा
list.stream().map(e -> e + 1); // Can apply a transformation function for e
Iterable.forEach , Stream.forEach , ...
(जावा 8 की स्ट्रीम एपीआई से एक मानचित्र विधि (देखें @ i_am_zero का उत्तर)।)
जावा 8 संग्रह कक्षाओं में जो लागू होते हैं Iterable
(उदाहरण के लिए, सभी List
एस) में अब एक forEach
विधि है, जिसका उपयोग ऊपर दिखाए गए लूप स्टेटमेंट के लिए किया जा सकता है। (यहां एक और सवाल है जो एक अच्छी तुलना प्रदान करता है।)
Arrays.asList(1,2,3,4).forEach(System.out::println);
// 1 - can call methods of an element
// 2 - would need reference to containing object to remove an item
// (TODO: someone please confirm / deny this)
// 3 - functionally separates iteration from the action
// being performed with each item.
Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
// Same capabilities as above plus potentially greater
// utilization of parallelism
// (caution: consequently, order of execution is not guaranteed,
// see [Stream.forEachOrdered][stream-foreach-ordered] for more
// information about this).
अन्य तरीके क्या हैं, यदि कोई हो?
(BTW, मेरी रुचि प्रदर्शन को अनुकूलित करने की इच्छा से बिल्कुल भी नहीं है , मैं सिर्फ यह जानना चाहता हूं कि एक डेवलपर के रूप में मेरे लिए कौन से रूप उपलब्ध हैं।)
List
इंटरफ़ेस के बारे में विशेष रूप से सवाल है ?