2012-07-10 13 views
7

मैं एक एमआर नौकरी लिखने की प्रक्रिया में हूं। लेकिन मैं एक इटेबल ऑब्जेक्ट से संबंधित एक मुद्दे से फंस गया हूँ। मुझे इसका आकार ढूंढना होगा। मैंने इसे एक सूची ऑब्जेक्ट पर डाला, लेकिन यह गलत था। (सूची को इटेबल करने के लिए जाया जा सकता है, लेकिन उलट नहीं कर सकता।) एक और तरीका है, यानी ऑब्जेक्ट के लिए इटरेटर का उपयोग करके और प्रत्येक मान के लिए काउंटर को बढ़ाकर। लेकिन यह एक इष्टतम समाधान नहीं है। क्या कोई बेहतर तरीका सुझा सकता है?एक इटेबल ऑब्जेक्ट का आकार कैसे ढूंढें?

कृपया मेरी मदद करें। अग्रिम धन्यवाद।

+0

कृपया अपना कोड यहां लिखें ताकि हम इसे देख सकें। –

+0

यह सवाल वास्तव में संपादित में जुड़े हुए किसी एक का डुप्लिकेट का मन नहीं करता – shieldgenerator7

उत्तर

15

Collection इंटरफ़ेस size() विधि प्रदान करता है और यह Iterable बढ़ाता है। यदि आपका पुनरावृत्ति एक संग्रह से आती है, तो आप इसे अपने आकार के लिए पूछ सकते हैं, अन्यथा आप भाग्य से बाहर हैं, आपको बस अंत तक फिर से शुरू करना होगा।

यहाँ एक हैक है कि इस को लागू करता है:

public int size(Iterable<?> it) { 
    if (it instanceof Collection) 
    return ((Collection<?>)it).size(); 

    // else iterate 

    int i = 0; 
    for (Object obj : it) i++; 
    return i; 
} 
0

इटरेटर() उस पर एक आकार नहीं है, लेकिन संग्रह है जहाँ से इटरेटर प्राप्त किया गया है में से कुछ, एक आकार() है जावा की तरह। util.LinkedList.size()। तो, आपको कुछ मामलों में फिर से शुरू करना पड़ सकता है।

+0

समस्या कम करने समारोह के साथ है: संरक्षित अंतिम शून्य को कम (अंतिम पाठ कुंजी, \t \t \t \t अंतिम Iterable मूल्यों, अंतिम संदर्भ संदर्भ) \t \t \t \t आईओएक्सप्शन, इंटरप्टेड एक्सेप्शन { ...... } यहां "मान" एक इटेबल ऑब्जेक्ट है। मुझे इसके आकार को फिर से बिना ढूंढने की ज़रूरत है। लेकिन यह संभव नहीं है क्योंकि संग्रह वस्तु नहीं है। मुझे आकार खोजने के बाद कुछ अन्य ऑपरेशन करने की ज़रूरत है। अगर मैं इस वस्तु पर पुनरावृत्ति कर रहा हूं, तो पुनरावृत्ति के बाद, इटेटरेटर अपने अंतिम मूल्य को इंगित करेगा। मुझे इसे रीसेट करने की जरूरत है। तो मैं एक resettableIterator का उपयोग कर रहा हूँ ताकि पुनरावृत्ति के बाद मैं इसे रीसेट कर सकते हैं। –

+0

आपको 'Iterable 'से जितनी बार चाहें' iterator() 'के लिए पूछने में सक्षम होना चाहिए, यही कारण है कि आपको' Iterable' मिलता है, न कि 'Iterator'' को कम करें। तो 'Iterator a = values.iterator(), b = values.iterator();' पूरी तरह से मान्य है और जब तक आप 'हटाएं()' को कॉल नहीं करते हैं तब तक उन्हें स्वतंत्र होना चाहिए। – TWiStErRob

5

आपको इटेटरेटर से गुजरना है और आइटमों को गिनना है। उदाहरण के लिए,

  while (iterator.hasNext()) { 
      iterator.next(); 
      count++; 
     } 

यह बहुत साफ नहीं है, लेकिन इटरेटर पुनरावृति के उद्देश्य के साथ प्रयोग किया जाता है और उस के लिए कोई विशिष्ट एपीआई प्रदान नहीं करता है।

लेकिन, इटेटरेटर कहां बनाया गया है? यदि यह किसी अन्य ऑब्जेक्ट से आता है, उदाहरण के लिए एक संग्रह ऑब्जेक्ट, तो आप स्रोत का आकार निर्धारित कर सकते हैं, न कि इटरेटर स्वयं।

+0

यह एक पुनरावर्तनीय के मामले में काम नहीं करेगा। – Siddarth