2010-10-15 14 views
7

मुझे जावा में फॉर-प्रत्येक-लूप निर्माण (for(T e : iterable)) बहुत पसंद है जो किसी भी Iterable<T> पर काम करता है क्योंकि यह कई मामलों में पढ़ने और कोड लिखने में बहुत आसान बनाता है।जावा इटरेटर्स और प्रत्येक-लूप के लिए। अंतर्निहित पुनरावर्तक तक पहुंचने का कोई तरीका?

मुझे आश्चर्य है कि अगर ऐसा कोई तरीका है कि मैं ऐसे लूप से अंतर्निहित पुनरावर्तक तक पहुंच सकता हूं। अगर मैं इटरेटर से remove() का उपयोग करना चाहता हूं तो यह अनिवार्य हो सकता है।

उत्तर

17

नहीं, प्रत्येक-लूप के पूरे बिंदु अंतर्निहित पुनरावर्तक को दूर करना है।

यदि आपको इसकी आवश्यकता है, तो आपको इसे घोषित करना होगा।

+1

और जब आप इसे घोषित करते हैं, तो यह सूची सूची से होना चाहिए यदि आप सूची से वस्तुओं को हटाने की योजना बना रहे हैं। –

1

इसके बजाय लूप का उपयोग करें।

4

नहीं, आप प्रत्येक पाश के लिए ऑब्जेक्ट्स को हटा नहीं सकते हैं।

उपयोग इस बजाय:

Iterator<Type> it = collection.iterator(); 

while (it.hasNext()) { 
    if (it.next().shouldBeRemoved()) { 
     it.remove(); 
    } 
} 
+3

मैं सामान्य रूप से 'id' idiom की बजाय 'मूर्ख' को प्राथमिकता देता हूं क्योंकि यह इटरेटर के दायरे को छोटा रखता है। – dty

+3

@dty: सभी चरों को यथासंभव संकीर्ण रखने की आपकी इच्छा में एक वैध बिंदु है। लेकिन मेरे लिए, कोड पठनीयता पहली जगह पर है। मेरा संस्करण लगभग सामान्य वाक्य के रूप में पढ़ा जा सकता है: 'जबकि इटरेटर के पास अगला तत्व निम्न है: ...', और आपका बहुत बोझिल लगता है। इसलिए, अगर हम दोनों दृष्टिकोणों से लाभ रखना चाहते हैं, तो मेरे कोड को एक अलग विधि में निकालने के लायक है। आईएमएचओ इस समस्या के साथ हम सबसे अच्छा कर सकते हैं। – Roman

0

डेटा को संशोधित करने के लिए एक गलत यह करने के लिए लग रहा है, बस एक नया Iterable (या संग्रह) बना सकते हैं और आइटम आप इसे करने के लिए रखना चाहते हैं, तो कई बार कर रहे हैं जोड़ने है लूप में खो गया ((kinda **

+0

आपने लोगों को कभी भी कार्यात्मक प्रोग्रामिंग के बारे में नहीं सुना है – fringd

1

यदि संग्रह उचित रूप से छोटा है, तो आप वैकल्पिक रूप से संग्रह की एक प्रति का उपयोग कर सकते हैं यदि आप तत्वों को निकालने में सक्षम होना चाहते हैं तो आपको कार्य नहीं करना पड़ेगा यदि आपके पास दो संग्रह हैं।

for(T e : collection.clone()) 
    if(e.shouldBeRemoved()) 
     collection.remove(); 

इससे भी बेहतर, अपाचे संग्रह उपयोग (और शायद एक Google विकल्प और जेनेरिक विकल्प है) filter(java.util.Collection collection, Predicate predicate) प्रदान करता है। यह उदाहरण पूरी सूची देता है। आप पुन: उपयोग के लिए एक भविष्यवाणी स्टोर कर सकते हैं।

CollectionUtils.filter(collection, new Predicate(){ 
     boolean evaluate(Object object){return true;} 
    }); 
1

आप सही हैं, एक इटरेटर का उपयोग कर एक स्रोत संग्रह सुरक्षित रूप से एक वस्तु को निकालने के लिए, इटरेटर पर ही बुला हटाने() द्वारा क्षमता का समर्थन करता है। यहां बिंदु एक ConcurrentModifiedException से बचने के लिए है जिसका अर्थ है कि एक संग्रह को संशोधित किया गया था जबकि एक इटरेटर इसके खिलाफ खुला था। कुछ संग्रह आपको इसे संग्रहित करते समय संग्रह में तत्वों को हटाने या जोड़ने के साथ दूर जाने देंगे, लेकिन इटरेटर पर हटाने() को कॉल करना एक सुरक्षित अभ्यास है।

लेकिन इटरेटर एक व्युत्पन्न और अधिक शक्तिशाली चचेरे भाई ListIterator, सूचियाँ से ही उपलब्ध का समर्थन करता है, दोनों को जोड़ने और यात्रा के दौरान एक सूची से निकालने, साथ ही सूची के माध्यम से द्विदिश स्क्रॉल का समर्थन करता है।

संबंधित मुद्दे

 संबंधित मुद्दे