2010-09-28 25 views
8

मैं एक सेट पर फिर से शुरू करना चाहता हूं और सेट से तत्वों को हटा सकता हूं जो कुछ शर्त से मेल खाते हैं। documentation of iterator उस पर पुनरावृत्ति करते समय सूची को संशोधित करने के बारे में कुछ भी नहीं कहता है।जावा सेट इटरेटर, तत्वों को हटाने के लिए सुरक्षित?

क्या यह संभव है? यदि नहीं, तो ऐसा करने का सबसे अच्छा तरीका क्या होगा? ध्यान दें कि मैं केवल इटरेटर द्वारा प्रदान किए गए सेट से तत्वों को हटाना चाहता हूं।

संपादित करें: जल्दी से दिखाया गया था कि यह संभव है। क्या मैं इसे निम्नलिखित वाक्यविन्यास के साथ भी कर सकता हूं?

for(Node n : mySet) { 
    mySet.remove(n); 
} 
+0

"क्या मैं इसे निम्नलिखित वाक्यविन्यास के साथ भी कर सकता हूं?"। सं। – Thilo

उत्तर

16

हाँ, आप सुरक्षित रूप से मौजूदा तत्व को दूर करने के इटरेटर का उपयोग कर सकते हैं:

iterator.remove(); 

remove() की javadoc का कहना है:

इस सेट से निर्दिष्ट तत्व निकालता है अगर यह होता है वर्तमान (वैकल्पिक ऑपरेशन)। अधिक औपचारिक रूप से, एक तत्व ई को हटा देता है जैसे कि (o == null? E == null: o.equals (e)), यदि इस सेट में ऐसा तत्व है। यदि इस सेट में तत्व शामिल है (या समकक्ष, यदि कॉल के परिणामस्वरूप यह सेट बदल गया है) तो सत्य वापस आता है। अपने अगले सवाल का (यह सेट एक बार कॉल रिटर्न तत्व शामिल होंगे नहीं।)


उत्तर: नहीं, आप नहीं कर सकते हैं। लूप के लिए एक उन्नत के साथ इसे फिर से सेट करते समय एक सेट को संशोधित करने से ConcurrentModificationException हो जाएगा।

+1

और यह एकमात्र तरीका है जब आप पुनरावृत्ति करते समय संग्रह को संशोधित कर सकते हैं। और कुछ भी आपको एक समवर्ती मोडिफिकेशन अपवाद देगा। – Thilo

+0

धन्यवाद !!!!!!!!! –

1

टैंगेंस का उत्तर सही है। आप iterator.remove() का उपयोग नहीं है, लेकिन सेट से सीधे निकालने के लिए, आप एक अपवाद कॉल ConcurrentModificationException

0

प्राप्त होगा यह पहली .remove() क्या करता है:

http://download.oracle.com/javase/6/docs/api/java/util/Iterator.html#remove%28%29

"से निकालता है अंतर्निहित संग्रह इटेटर (वैकल्पिक ऑपरेशन) द्वारा लौटाया गया अंतिम तत्व। इस विधि को प्रति कॉल केवल एक बार बुलाया जा सकता है। अगर पुनरावृत्ति संग्रह को संशोधित किया जाता है तो पुनरावृत्ति संग्रह को संशोधित किया जाता है, जबकि पुनरावृत्ति किसी अन्य तरीके से प्रगति पर है इस विधि को कॉल करके। "

-1

(नोड एन: माइसेट) { mySet.remove (n); }

काम नहीं करेगा क्योंकि आप उस सेट को संशोधित कर रहे हैं जिसे आप पुन: सक्रिय कर रहे हैं। हालांकि यह केवल इटरेटर का उपयोग करके किया जा सकता है जो इस तरह से मामला नहीं है।

यह लूप के लिए उन्नत का उपयोग करने का एक नुकसान है।

0

यह वास्तव में जावा 8. में सुधार हुआ है अब आप बस

mySet.removeIf(element -> someConditionMatches());

ऊपर एक default पद्धति के रूप में java.util.Collection में कार्यान्वित किया जाता और उबाऊ छोरों लिखने से हर किसी को बचाने के लिए करना चाहिए कर सकते हैं। उस ने कहा, इसे किसी भी प्रकार के संग्रह के लिए काम करना चाहिए, न केवल Set

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