2013-06-02 9 views
14

कक्षा पर size() विधि के लिए कोई उपयोग केस है?बिटसेट के आकार() विधि का कारण क्या है?

मेरा मतलब है - जावाडोक स्पष्ट रूप से कहता है कि यह कार्यान्वयन निर्भर है, यह बिट्स में आंतरिक long[] संग्रहण का आकार देता है। यह क्या कहते हैं से, यह निष्कर्ष निकाल सकता है कि आप size() तुलना में एक उच्च सूचकांक के साथ एक सा सेट करने के लिए सक्षम नहीं होगा, लेकिन यह सच नहीं है, BitSet स्वचालित रूप से बढ़ सकता है:

BitSet myBitSet = new BitSet(); 
System.out.println(myBitSet.size()); // prints "64" 
myBitSet.set(768); 
System.out.println(myBitSet.size()); // prints "832" 

BitSet साथ हर एक मुठभेड़ में मैंने अपने जीवन में पड़ा है, मैं हमेशा के बाद से है कि एक BitSet की तार्किक आकार देता है length() उपयोग करना चाहता था:

BitSet myBitSet = new BitSet(); 
System.out.println(myBitSet.length()); // prints "0" 
myBitSet.set(768); 
System.out.println(myBitSet.length()); // prints "769" 

यहां तक ​​कि मैं पिछले 6 वर्षों के लिए जावा प्रोग्रामिंग कर दिया है, हालांकि, दो तरीकों हमेशा अत्यधिक हैं मेरे लिए भ्रमित मैं अक्सर उन्हें मिलाकर गलत तरीके से उपयोग करता हूं, क्योंकि मेरे सिर में, मुझे BitSet एक चालाक Set<boolean> के रूप में लगता है जहां मैं size() का उपयोग करता हूं।

ऐसा लगता है कि ArrayListlength() तत्वों की संख्या और size() अंतर्निहित सरणी के आकार को वापस कर रहा था।

अब, क्या size() विधि के लिए कोई उपयोग केस है जो मुझे याद आ रही है? क्या यह किसी भी तरह से उपयोगी है? क्या किसी ने कभी भी इसका इस्तेमाल किया है? क्या यह कुछ मैन्युअल बिट twiddling या कुछ समान के लिए महत्वपूर्ण हो सकता है?


संपादित (कुछ और अधिक शोध के बाद)

मुझे एहसास हुआ BitSet जावा 1.0 में पेश किया गया था, जबकि कक्षाएं उपयोग हम में से ज्यादातर के साथ संग्रह ढांचे जावा 1.2 में पेश किया गया था। तो मूल रूप से मुझे लगता है कि size() विरासत कारणों से रखा गया है और इसके लिए कोई वास्तविक उपयोग नहीं है। नए संग्रह वर्गों में ऐसी विधियां नहीं हैं, जबकि कुछ पुराने (Vector, उदाहरण के लिए) करते हैं।

उत्तर

4

मुझे एहसास हुआ कि बिट 1.0 को जावा 1.0 में पेश किया गया था, जबकि हमारे द्वारा उपयोग किए जाने वाले अधिकांश वर्गों के साथ संग्रह ढांचे को जावा 1.2 में पेश किया गया था।

सही।

तो मूल रूप से ऐसा लगता है कि आकार() विरासत कारणों से रखा जाता है और इसके लिए कोई वास्तविक उपयोग नहीं है।

हाँ, बहुत कुछ।

अन्य "आकार" विधि length() है जो आपको सबसे बड़ी अनुक्रमणिका देता है जिस पर थोड़ा सा सेट होता है। एक तार्किक परिप्रेक्ष्य से, length()size() से अधिक उपयोगी है ... लेकिन length() केवल जावा 1.2 में पेश किया गया था।

  • आप में बिट्स की एक यात्रा के लिए एक "बाड़ पोस्ट" स्थापित करने के लिए कोशिश कर रहे हैं:

    केवल (काल्पनिक) का उपयोग-केस मैं कहाँ size()length() की तुलना में बेहतर हो सकता है के बारे में सोच सकते हैं जब है सेट, और

  • यह अत्यधिक संभावना है कि आप अंत से पहले अच्छी तरह से फिर से चलना बंद कर देंगे, और
  • इससे कोई फर्क नहीं पड़ता कि आप सेट की गई अंतिम बिट से थोड़ा आगे जाते हैं।

उस स्थिति में, size()length() से तर्कसंगत रूप से बेहतर है क्योंकि यह एक सस्ता कॉल है। (स्रोत कोड देखें ...) लेकिन यह बहुत मामूली है।

(मुझे लगता है, इसी तरह की तर्ज पर एक और यूज-केस जब आप एक नया BitSet बनाने और एक मौजूदा BitSet की size() के आधार पर यह preallocating कर रहे हैं। फिर, अंतर सीमांत है।)

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

+0

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

0

यह 0 और 1 की संख्या है जो 64 का एक से अधिक होना चाहिए। आप 1s की संख्या के लिए कार्डिनिटी() का उपयोग कर सकते हैं।

+2

मुझे पता है कि यह क्या करता है। लेकिन मुझे आश्चर्य है कि क्यों कोई भी ऐसी विधि का आह्वान करना चाहेगा। या इसे एपीआई में पहली जगह में शामिल करें। क्या मैं 'बिट्ससेट' के उपयोग की पुरानी पीढ़ी के बारे में अपनी धारणा के साथ सही हूं? (मेरा संपादन देखें) –

+0

यह '0 और 1s की संख्या' नहीं है। यह ["बिट्स का प्रतिनिधित्व करने के लिए वास्तव में इस बिटसेट द्वारा उपयोग की जाने वाली जगह की बिट्स की संख्या"] है (http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html#size())। – EJP

+1

@EJP हालांकि यह स्पष्ट हो सकता है, अंतर मत देखें। क्या ऐसी जगह है जो 0s और 1s से भरा नहीं है? –

1

यदि size विधि जावा निर्माता द्वारा डिज़ाइन नहीं की गई थी जनता के रूप में, यह निस्संदेह एक निजी विधि/क्षेत्र के रूप में मौजूद होगा। इसलिए हम इसकी पहुंच और शायद नामकरण पर चर्चा कर रहे हैं।

जावा 1.0 ने सी/सी ++ से केवल प्रक्रियात्मक वाक्यविन्यास नहीं बल्कि बहुत प्रेरणा ली। सी ++ मानक पुस्तकालय में, समकक्ष BitSet के length और size भी मौजूद हैं। उन्हें क्रमश: size और capacity कहा जाता है। सी ++ में capacity का उपयोग करने के लिए शायद ही कभी कोई कठिन कारण है, और यहां तक ​​कि जावा जैसे कचरा एकत्रित भाषा में भी कम है, लेकिन विधि सुलभ होने के बावजूद अभी भी उपयोगी है। मैं जावा शर्तों में समझाऊंगा।

मुझे बताएं, ऑपरेशन जैसे set निष्पादित करने के लिए मशीन निर्देशों की अधिकतम संख्या क्या है? कोई "केवल एक मुट्ठी भर" का जवाब देना चाहता है, लेकिन यह केवल तभी सच है जब उस विशेष ऑपरेशन के परिणामस्वरूप संपूर्ण अंतर्निहित सरणी का पुनर्वितरण न हो। सैद्धांतिक रूप से, पुनर्मूल्यांकन एक स्थिर समय एल्गोरिदम को एक रैखिक समय में बदल देता है।

क्या यह सैद्धांतिक अंतर बहुत व्यावहारिक प्रभाव डालता है? शायद ही कभी। सरणी आमतौर पर अक्सर नहीं बढ़ती है। हालांकि, जब भी आपके पास लगभग BitSet धीरे-धीरे बढ़ते अंतिम आकार के साथ एक एल्गोरिदम चल रहा है, तो आप अंतिम आकार को पहले से BitSet के निर्माता को पास करते हैं, तो आप पुनर्वितरण पर सहेज लेंगे। कुछ बहुत ही विशेष परिस्थितियों में इसका एक उल्लेखनीय प्रभाव भी हो सकता है, ज्यादातर परिस्थितियों में यह चोट नहीं पहुंचाता है।

  • set तब निरंतर समय जटिलता है - कॉलिंग यह कभी भी लंबे समय तक एप्लिकेशन को अवरुद्ध नहीं कर सकती है।
  • यदि केवल एक बेहद बड़ा BitSet उदाहरण आपकी सभी उपलब्ध मेमोरी (डिज़ाइन द्वारा) का उपयोग कर रहा है, तो स्वैपिंग बाद में बाद में शुरू हो सकती है कि आपका JVM विकास ऑपरेशन को कैसे लागू करता है (अतिरिक्त प्रति के साथ या बिना)।

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

0

मुख्य कारण यह है कि मुझे लगता है कि यह उपयोगी हो सकता है जब हमें बिटसेट क्लास को विस्तारित करने और लंबाई विधि को ओवरराइड करने की आवश्यकता होती है। उस मामले में, आकार उपयोगी है। नीचे आकार विधि पर निर्भरता के साथ लंबाई रिटर्न मूल्य कितना है।

protected Set bitset; 
public int length() { 
    int returnValue = 0; 
    // Make sure set not empty 
    // Get maximum value +1 
    if (bitset.size() > 0) { 
    Integer max = (Integer)Collections.max(bitset); 
    returnValue = max.intValue()+1; 
    } 
    return returnValue; 
} 
संबंधित मुद्दे