2008-11-18 27 views
9

मान लें कि मेरे पास List ऑब्जेक्ट और उस सूची के लिए एक इटरेटर है।जब मैं एक सूची क्रमबद्ध करता हूं तो इसके इटरेटर के साथ क्या होता है?

अब मैं java.util.Collections.sort()

  • इटरेटर का क्या होता है के साथ इस सूची को सॉर्ट?
  • क्या इसका व्यवहार अभी भी परिभाषित है और क्या इसका अभी भी उपयोग किया जा सकता है?
  • यदि नहीं, तो क्या मैं सूची के लिए इटरेटर को नष्ट कर सकता हूं?

मुझे पता है, इस समस्या को प्रोग्राम डिज़ाइन को बदलकर, उदाहरण के लिए सूची को क्लोन करके अवरुद्ध किया जा सकता है, लेकिन मैं विशिष्ट रूप से जावा के "आधिकारिक" व्यवहार को जानना चाहता हूं।

उत्तर

15

java.util में संग्रह में से अधिकांश हैं "असफल फास्ट" और एक ConcurrentModificationException फेंक सकता है अगर अंतर्निहित संग्रह बदला गया है। यह इंगित किया जाना चाहिए कि यह डिबगिंग के लिए है और इसलिए इसकी गारंटी नहीं है। javadocs के अनुसार, इस AbstractList के सभी decedents का सच है, लेकिन इस नहींCopyOnWriteArrayList है, जो मल्टी-थ्रेडेड उपयोग के लिए इरादा है का सच है।

17

इटरेटर आमतौर पर के बाद उनके अंतर्निहित संग्रह में संशोधन, इटेटरेटर के माध्यम से छोड़कर अमान्य होते हैं। (उदाहरण के लिए, ListIterator सम्मिलन और निष्कासन के लिए अनुमति देता है।)

मैं निश्चित रूप से किसी भी प्रकार के इटरेटर को एक प्रकार के बाद अमान्य होने की उम्मीद करता हूं - और यदि वे नहीं थे, तो मुझे नहीं पता था कि किस आदेश की अपेक्षा की जा सकती है।

+0

यह एक इटरेटर के लिए स्पष्ट उत्तर '' संग्रह c' में ओर इशारा करते हुए p' है। दो पुनरावृत्तियों 'पी' और' क्यू 'के समान संग्रह' सी' में इशारा करते हुए और स्वतंत्र रूप से पुनरावृत्त होने के बारे में क्या? क्या _ "इटेटरेटर के माध्यम से छोड़कर" _ का अर्थ है 'पी' जैसे इटरेटर का विशिष्ट उदाहरण या इसका मतलब इटरेटर का कोई उदाहरण है? मुझे लगता है कि 'पी' और' q' का स्वतंत्र पुनरावृत्ति एक दूसरे को अमान्य कर देगा (केवल इसलिए कि न तो इसे अन्य इटरेटर के बारे में पता है और न ही संग्रह अपने सभी इटरेटर को याद करता है), लेकिन इसे यहां स्पष्ट करना अच्छा है। धन्यवाद! – uvsmtid

+1

@uvsmtid: यह उस विशिष्ट इटरेटर के माध्यम से छोड़कर है। यदि आपके पास एक ही संग्रह पर दो पुनरावर्तक हैं, तो आप उनमें से किसी के माध्यम से संग्रह को संशोधित नहीं कर सकते हैं, जब तक कि यह एक ऐसा संग्रह न हो जो समवर्ती संशोधन का स्पष्ट रूप से समर्थन करता हो। –

4

आम तौर पर, एक संग्रह पर उत्परिवर्तन के किसी भी प्रकार के अपने iterators अमान्य हो जाएगा। एक पुनरावर्तक के माध्यम से किया गया एक उत्परिवर्तन उस इटरेटर को अमान्य नहीं करेगा। कुछ असाधारण संग्रह कार्यान्वयन हैं, जैसे कि CopyOnWriteArrayList

सामान्य समाधान संग्रह की एक प्रति को सॉर्ट करने या अपने iterators से बनाना होगा।

2

मैं देख रहा हूँ कि जब एक संग्रह है, जबकि आप पुनरावृत्ति कर रहे हैं सॉर्ट हो जाता है कि क्या होता है कुछ कोड लिखा था। ऐसा लगता है कि इटेटरेटर कोई अपवाद नहीं फेंकता है, लेकिन सामान्य रूप से फिर से जारी रहता है। फिर भी यदि आप बिना किसी संग्रह के पुन: संग्रह की अपेक्षा कर रहे हैं तो यह आपको गलत परिणाम देता है। इसे देखें:

public static void main(String[] args) { 
    List<String> list = new ArrayList<String>(); 
    list.add("D"); 
    list.add("B"); 
    list.add("A"); 
    list.add("C"); 
    list.add("E"); 

    Iterator<String> it = list.iterator(); 
    String s = it.next(); 
    System.out.println(s); 
    s = it.next(); 
    System.out.println(s); 

    Collections.sort(list); 
    Iterator<String> it2 = list.iterator(); 

    s = it.next(); 
    System.out.println(s); 
    s = it.next(); 
    System.out.println(s); 
    s = it.next(); 
    System.out.println(s); 

    while (it2.hasNext()) { 
     System.out.println(it2.next()); 
    } 
    } 

उम्मीद है कि यह मदद करता है।

+0

कहाँ "सामान्य रूप से" भी शामिल है "एक ही तत्व फिर से देख सकता है" ... मैं थोड़ा निराश है कि यह एक अपवाद फेंक नहीं है हूँ, ईमानदार होना। –

+0

अपवाद को फेंकने की गारंटी नहीं है, यह डिबगिंग के लिए है। – sblundy

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

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