एक संग्रह में बनाम बनाम लंबाई का आकार


167

कई प्रोग्रामिंग भाषाओं और पुस्तकालयों का उपयोग करने से लेकर मैंने संग्रह में तत्वों की कुल संख्या के लिए उपयोग किए जाने वाले विभिन्न शब्दों पर ध्यान दिया है।

सबसे आम होने लगते हैं length, countऔर size

जैसे।

array.length
vector.size()
collection.count

क्या कोई पसंदीदा शब्द इस्तेमाल किया जाना है? क्या यह निर्भर करता है कि यह किस प्रकार का संग्रह है? अर्थात। परिवर्तनशील / अपरिवर्तनीय

क्या इसके लिए एक विधि के बजाय एक संपत्ति होने की प्राथमिकता है?


और List.CapacityC # में भी संपत्ति है।
RBT

मुझे उम्मीद है कि नई भाषाएं अस्पष्ट शब्दों से बचेंगी।
निकोले क्लिमचुक

जवाबों:


231

Length() सन्निहित तत्वों को संदर्भित करता है - उदाहरण के लिए एक स्ट्रिंग की लंबाई होती है।

Count() एक शिथिल संग्रह में तत्वों की संख्या को संदर्भित करता है।

Size() संग्रह के आकार को संदर्भित करता है, अक्सर यह वैक्टर (या तार) जैसे मामलों में लंबाई से भिन्न हो सकता है, एक स्ट्रिंग में 10 वर्ण हो सकते हैं, लेकिन भंडारण 20 के लिए आरक्षित है। यह संख्या की संख्या का भी उल्लेख कर सकता है। एलिमेंट्स - चेक सोर्स / डॉक्यूमेंटेशन।

Capacity()- विशेष रूप से संग्रह में आवंटित स्थान को संदर्भित करने के लिए उपयोग किया जाता है और इसमें वैध तत्वों की संख्या नहीं है। यदि प्रकार में "क्षमता" और "आकार" दोनों परिभाषित हैं तो "आकार" आमतौर पर वास्तविक तत्वों की संख्या को संदर्भित करता है।

मुझे लगता है कि मुख्य बिंदु मानव भाषा और मुहावरों के लिए नीचे है, एक स्ट्रिंग का आकार बहुत स्पष्ट नहीं लगता है, जबकि एक सेट की लंबाई समान रूप से भ्रामक है, भले ही वे एक ही चीज़ (तत्वों की संख्या) का उल्लेख करने के लिए उपयोग किए जाते हों ) डेटा के संग्रह में।


5
तो "शिथिल संग्रह" क्या है? मैं यहाँ आकार और गिनती के बीच का अंतर नहीं देख रहा हूँ।
सोफी अल्परट

32
@ नोट: आकार = उपलब्ध स्लॉट, गणना = वास्तविक तत्व। आकार == जब संग्रह भरा हुआ हो तब गिनती करें।
स्टीवन एवर्स

8
डाउनवोटिंग क्योंकि size()वेक्टर में तत्वों की संख्या को संदर्भित करता है, कि capacity()... कम से कम C ++ में, जो मुझे लगता है कि vectors के साथ sizes का प्रवर्तक है ।
डेव अब्राहम

10
@DaveAbrahams - मैंने ऐसा कभी नहीं कहा था। इसे फिर से पढ़ो। मैंने कहा कि यह "संदर्भित करता है", मैंने कभी भी एक विशिष्ट कथन बनाने की कोशिश नहीं की जो सभी भाषाओं में सभी संग्रह कक्षाओं के सभी क्रमपरिवर्तन पर समान रूप से लागू होता है।
gbjbaanb

2
@SnOrfus मुझे लगता है कि आप वहां "क्षमता" के दायरे में चले गए हैं। std::vector(C ++) उदाहरण के लिए "क्षमता" और "आकार" का उपयोग करता है, जहां आप क्रमशः "आकार" और "गणना" का उपयोग करते हैं। वास्तव में, सब कुछ में std::उपयोग करता है "आकार" वर्तमान तत्व गिनती, यहां तक कि के लिए std::string(जो टेम्पलेट संगतता और एक पूरी तरह से समान के लिए ... मानव सुविधा "लंबाई" मुझे लगता है कि के लिए "आकार" प्रदान करता है)।
जेसन सी

28

एफडब्ल्यूआईडब्ल्यू (और यह लुप्तप्राय कुछ भी नहीं है), मैं 'काउंट' को पसंद करता हूं क्योंकि यह इंगित करता है कि यह संग्रह में तत्वों / वस्तुओं की संख्या को बहुत ही स्पष्ट रूप से वापस करने जा रहा है।

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

लेकिन कोई भी जो जावा, BCL / .Net, या C / C ++ मानक चौखटे / पुस्तकालयों द्वारा उपयोग किए जाने वाले नामकरण सम्मेलनों के लिए ज़िम्मेदार था, जो मुझे पूछने के लिए परेशान थे, इसलिए आप जो भी लेकर आए हैं, आप सभी के साथ फंस गए हैं।

अगर केवल मैं ही अधिक चालाक था और मुझे बज्ने नाम दिया गया था, तो आप सभी को दुख से बचाया जा सकता है ...

बेशक, वास्तविक दुनिया में वापस, आपको जो भी नामकरण परंपरा का उपयोग कर भाषा / मंच का उपयोग करना है (जैसे, size()सी ++ में) द्वारा छड़ी करने की कोशिश करनी चाहिए । ऐसा नहीं है कि यह आपकी Array.Lengthदुविधा के साथ मदद करता है।


16
जबकि लंबाई और आकार संज्ञाएं हैं, गणना भी एक क्रिया है, इस प्रकार इसे रनटाइम (ओ (एन)) बनाम एक मान (ओ (1)) देखने के रूप में गिना जा सकता है।
MBX

वास्तव में, यह बिल्कुल वैसा ही है जैसा कि LINQ में प्रयोग किया जाता है: Enumerable.Count
Edward Brey

11

शब्द कुछ हद तक परस्पर भिन्न होते हैं, हालांकि कुछ स्थितियों में मैं एक दूसरे पर पसंद करूंगा। आमतौर पर आप सबसे अच्छा उपयोग प्राप्त कर सकते हैं यदि आप इस बारे में सोचते हैं कि आप इस तत्व की लंबाई / आकार / गणना का किसी अन्य व्यक्ति को मौखिक रूप से कैसे वर्णन करेंगे?

length()तात्पर्य है कि तत्व की लंबाई है। एक स्ट्रिंग की लंबाई होती है। आप कहते हैं "एक स्ट्रिंग 20 वर्ण लंबा है", है ना? तो इसकी लंबाई है।

size()तात्पर्य है कि तत्व का आकार है। जैसे किसी फ़ाइल का आकार होता है। आप कहते हैं "इस फ़ाइल का आकार 2 एमबी है", है ना? तो इसका एक आकार है।

उस ने कहा, एक तार का आकार भी हो सकता है, लेकिन मैं यहां कुछ और की उम्मीद करूंगा। उदाहरण के लिए, UTF-16 स्ट्रिंग में 100 वर्णों की लंबाई हो सकती है, लेकिन जैसा कि प्रत्येक वर्ण दो बाइट से बना होता है, मुझे आकार 200 होने की उम्मीद है।

count()बहुत ही असामान्य है। उद्देश्य-सी एक सरणी में तत्वों की संख्या के लिए गणना का उपयोग करता है। यदि किसी सरणी की लंबाई (जावा में) है, तो उसका आकार (अधिकांश अन्य भाषाओं की तरह) या एक गिनती हो सकती है। हालाँकि, आकार फिर से बाइट में आकार हो सकता है (यदि सरणी आइटम 32 बिट int हैं, प्रत्येक आइटम 4 बाइट है) और लंबाई ... मैं यह नहीं कहूंगा कि "एक सरणी 20 तत्व लंबा है", बल्कि अजीब लगता है मुझे। मैं कहता हूँ "एक सरणी में 20 तत्व होते हैं"। मुझे यकीन नहीं है कि अगर गिनती बहुत अच्छी तरह से व्यक्त करती है, लेकिन मुझे लगता है कि गिनती यहां के लिए एक संक्षिप्त रूप है elementCount()और फिर से लंबाई () या आकार () की तुलना में एक सरणी के लिए बहुत अधिक समझ में आता है।

यदि आप प्रोग्रामिंग भाषा में स्वयं की वस्तुओं / तत्वों का निर्माण करते हैं, तो अन्य समान तत्वों का उपयोग करना सबसे अच्छा है, क्योंकि प्रोग्रामर का उपयोग उस शब्द का उपयोग करके वांछित संपत्ति तक पहुंचने के लिए किया जाता है।


आपकी स्ट्रिंग सादृश्यता के बाद एक फ़ाइल में एक होना चाहिए length, लेकिन विभिन्न भंडारण sizesइसके डेटा को संग्रहीत करने के लिए अलग-अलग उपयोग कर सकते हैं । जावा भी java.io.File # लंबाई () में ऐसा सोचता है , लेकिन ऐसा लगता है कि दुनिया के बाकी लोग असहमत हैं।
इवान

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

4

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

और यह एक संपत्ति होनी चाहिए जैसा कि यह है: संग्रह का एक विवरण (उर्फ संपत्ति)। एक विधि का अर्थ यह होगा कि वस्तुओं की संख्या प्राप्त करने के लिए संग्रह के लिए कुछ करना होगा और यह सिर्फ अनपेक्षित लगता है।


3

हम्म ... मैं आकार का उपयोग नहीं करता। क्योंकि यह बाइट्स में आकार के साथ भ्रमित हो सकता है। लंबाई - सरणियों के लिए कुछ अर्थ बना सकता है, जब तक कि वे स्मृति के परिणामी बाइट्स का उपयोग करने वाले हों। हालांकि ... लंबाई ... किसमें? गिनती स्पष्ट है। कितने तत्व हैं। मैं गिनती का उपयोग करेगा।

संपत्ति / विधि के बारे में, मैं संपत्ति का उपयोग इसे तेजी से चिह्नित करने के लिए करूंगा, और यह धीमा करने के लिए विधि।

और, सबसे महत्वपूर्ण - मैं आपके द्वारा उपयोग की जा रही भाषाओं / पुस्तकालयों के मानकों से चिपका रहूंगा।


तो क्या एक DataBlock के बारे में, बस बाइट्स का एक गुच्छा। क्या इसकी लंबाई है या इसका आकार है?
मैकी

2

@ Gbjbaanb के जवाब में जोड़ना ...

यदि "संपत्ति" का अर्थ सार्वजनिक पहुंच है, तो मैं कहूंगा कि "विधि" को केवल एन्कैप्सुलेशन प्रदान करने और कार्यान्वयन को छिपाने के लिए पसंद किया जाता है।

आप countतत्वों या आप कैसे बनाए रखने के बारे में मन बदल सकते हैं count। यदि यह एक संपत्ति है, तो आप फंस गए हैं - यदि इसे एक विधि के माध्यम से स्वीकार किया जाता है, तो आप संग्रह के उपयोगकर्ताओं को प्रभावित किए बिना अंतर्निहित कार्यान्वयन को बदल सकते हैं।


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

आप किस "अधिकांश भाषाओं" का उल्लेख कर रहे हैं? सी, सी ++, जावा (बस कुछ नाम करने के लिए) ऐसा न करें। रूबी और ग्रूवी मुझे पता है। कृपया ध्यान दें कि मैंने जवाब कैसे शुरू किया, भी: "यदि 'संपत्ति' का तात्पर्य है ..." क्यों अटक गया? यदि क्लास में इंटरफ़ेस बदलता है, तो क्लाइंट को (आमतौर पर बोलना) बदलना होता है
केन जेंटल

1

अमृत ​​में वास्तव में भाषा में इसके साथ जुड़े स्पष्ट नामकरण योजना है।

जब एक डेटा संरचना में तत्वों की संख्या की "गिनती" की जाती है, तो अमृत भी एक सरल नियम का पालन करता है: फ़ंक्शन का नाम दिया जाता है sizeयदि ऑपरेशन निरंतर समय में होता है (यानी मान पूर्व-गणना की जाती है) या lengthयदि ऑपरेशन रैखिक है (यानी गणना इनपुट बढ़ने पर लंबाई धीमी हो जाती है)।


0

मेरे लिए, यह पूछना थोड़ा पसंद है कि क्या "फॉरच" प्रत्येक "के लिए" से बेहतर है। यह सिर्फ भाषा / रूपरेखा पर निर्भर करता है।


और, इससे क्या फर्क पड़ता है? कौन सा शुल्क? क्या हम सभी दो को चुनने और असंगत होने के लिए जावा लोगों को गुस्सा ईमेल लिखने जा रहे हैं?
S.Lott

1
वह मेरी बात है। क्यों आश्चर्य है जो बेहतर है यह है जो यह है।
ईबीग्रीन

0

मैं कहूंगा कि यह उस विशेष भाषा पर निर्भर करता है जिसका आप उपयोग कर रहे हैं और कक्षाएं । सी # में उदाहरण के लिए आप सरणी का उपयोग कर रहे हैं, तो आपके पास संपत्ति की लंबाई, यदि आप कुछ IEnumerable से विरासत में मिली तुम हो कि एक्सटेंशन विधि गणना (), लेकिन यह तेजी से नहीं है। और अगर आपको ICollection विरासत में मिला है तो आपके पास Property Count है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.