स्क्रे में ऐरे और लिस्ट में अंतर


142

मुझे किन मामलों में ऐरे (बफर) और सूची (बफर) का उपयोग करना चाहिए। केवल एक अंतर जो मुझे पता है कि सरणियाँ गैर-भिन्न हैं और सूची सहसंयोजक हैं। लेकिन प्रदर्शन और कुछ अन्य विशेषताओं के बारे में क्या?

जवाबों:


155

अपरिवर्तनीय संरचनाएँ

स्काला List, अपरिवर्तनीय पुनरावर्ती डेटा संरचना जो स्काला में इस तरह के एक मौलिक संरचना है कि आप करना चाहिए (शायद) एक से अधिक उसका उपयोग Array(जो वास्तव में है परिवर्तनशील - अपरिवर्तनीय अनुरूप की Arrayहै IndexedSeq)।

यदि आप एक जावा बैकग्राउंड से आ रहे हैं, तो स्पष्ट पैरलल LinkedListओवर कब उपयोग करना है ArrayList। पूर्व आमतौर पर उन सूचियों के लिए उपयोग किया जाता है जो केवल कभी-कभी ट्रैवर्स किए गए हैं (और जिनके आकार का पता नहीं है) जबकि उत्तरार्द्ध का उपयोग उन सूचियों के लिए किया जाना चाहिए जिनके पास या तो ज्ञात आकार (या अधिकतम आकार) है या जिसके लिए तेजी से यादृच्छिक अभिगम महत्वपूर्ण है।

म्यूटेबल स्ट्रक्चर्स

ListBufferएक निरंतर-समय रूपांतरण प्रदान करता है, Listजो अकेले उपयोग करने का कारण है ListBufferयदि इस तरह के बाद के रूपांतरण की आवश्यकता होती है।

एक Arrayजावा सरणी द्वारा JVM पर एक स्केला लागू किया जाना चाहिए, और इसलिए एक से Array[Int]अधिक (जैसे int[]) ए List[Int](जो कि इसकी सामग्री को बॉक्स में देगा, जब तक कि आप स्काला के नवीनतम संस्करणों का उपयोग नहीं कर रहे हैं जो नई @specializedसुविधा हो) ।

हालांकि, मुझे लगता है कि Arrayस्काला में एस का उपयोग कम से कम रखा जाना चाहिए क्योंकि ऐसा लगता है कि आपको वास्तव में यह जानने की जरूरत है कि हुड के नीचे क्या चल रहा है यह तय करने के लिए कि क्या वास्तव में आपका सरणी आवश्यक आदिम प्रकार से समर्थित होगा, या हो सकता है। एक रैपर प्रकार के रूप में बॉक्सिंग करें।


यह भी देखें stackoverflow.com/questions/3213368/… और stackoverflow.com/questions/2481149/… Arrays के लिए "बराबरी" की परिभाषा यह है कि वे एक ही सरणी का उल्लेख करते हैं
oluies

130

पहले से ही पोस्ट किए गए उत्तरों के अलावा, यहां कुछ विशिष्टताएं हैं।

जबकि एक Array[A]वस्तुतः एक जावा सरणी है, एक List[A]अपरिवर्तनीय डेटा संरचना है जो या तो Nil(खाली सूची) है या इसमें एक जोड़ी शामिल है (A, List[A])

प्रदर्शन के अंतर

                          Array  List
Access the ith element    θ(1)   θ(i)
Delete the ith element    θ(n)   θ(i)
Insert an element at i    θ(n)   θ(i)
Reverse                   θ(n)   θ(n)
Concatenate (length m,n)  θ(n+m) θ(n)
Count the elements        θ(1)   θ(n)

स्मृति अंतर

                          Array  List
Get the first i elements  θ(i)   θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i    θ(n)   θ(i)
Reverse                   θ(n)   θ(n)
Concatenate (length m,n)  θ(n+m) θ(n)

इसलिए जब तक आपको तेजी से यादृच्छिक अभिगम की आवश्यकता नहीं होती है, तत्वों की गिनती करने की आवश्यकता होती है, या किसी कारण से आपको विनाशकारी अपडेट की आवश्यकता होती है, एक a Listसे बेहतर है Array


क्या इन ओएस को सूची की प्रतिलिपि बनाने के लिए समय पर विचार करना होगा? मुझे लगता है कि आप इस तरह से परीक्षण कर रहे हैं, जैसे list = list.drop(i):। या, हुड के पीछे कुछ जादू होता है?

2
यह आवश्यक होने पर सूचियों और सरणियों की प्रतिलिपि बनाने में लगता है। ध्यान दें कि जिन चीजों को dropकभी नहीं छोड़ा गया था, उस हिस्से को कॉपी करने की आवश्यकता नहीं है। जैसे (x::xs).drop(1)कि वास्तव में xs, "कॉपी" नहीं है xs
Apocalisp

6
इन स्पर्शोन्मुख दवाओं का स्काला से कोई लेना-देना नहीं है। सी में समान डेटा संरचना स्थिर कारकों के समान तेज़ होगी।
एपोकैलिस्प

1
@Apocalisp क्या आपके पास एक संदर्भ है या आपने किन परिस्थितियों में यह जानकारी निर्धारित की है?
फिल

1
@Phil ये स्पर्शोन्मुख हैं, माप नहीं। वे सभी परिस्थितियों में सही रहेंगे।
Apocalisp

18

एक सरणी परिवर्तनशील है, जिसका अर्थ है कि आप प्रत्येक सूचकांक के मूल्यों को बदल सकते हैं, जबकि एक सूची (डिफ़ॉल्ट रूप से) अपरिवर्तनीय है, जिसका अर्थ है कि हर बार जब आप एक संशोधन करते हैं तो एक नई सूची बनाई जाती है। ज्यादातर मामलों में यह अपरिवर्तनीय डेटाटाइप्स साथ काम करने के लिए एक अधिक "कार्यात्मक" शैली का है और आप शायद कोशिश करते हैं और जैसे निर्माणों के साथ एक सूची का उपयोग करना चाहिए yield, foreach, matchऔर इसके आगे।

प्रदर्शन विशेषताओं के लिए, तत्वों के लिए यादृच्छिक अभिगम के साथ एक ऐरे तेजी से होता है, जबकि नए तत्वों को प्रस्तुत करने (जोड़ने) के दौरान एक सूची तेज होती है। उनके ऊपर Iterating तुलनीय है।


@ एलोनम - एपोल्स, मैंने सोचा कि ओपी * बफ़र वर्गों के बारे में विशेष रूप से पूछ रहा था, मुझे एहसास है कि वे "सामान्य" लोगों के बारे में भी पूछ रहे थे!
oxbow_lakes

2
यह आमतौर पर एक ArrayBuffer के लिए एक सूची में प्रस्तुत करने की तुलना में तेज़ होता है (या एक सूची में एक तत्व जोड़ें) क्योंकि सूची को एक आवरण ऑब्जेक्ट के निर्माण की आवश्यकता होती है, जबकि ArrayBuffer को ऑब्जेक्ट को कॉपी करने की आवश्यकता होती है (औसत के बारे में दो बार) एक नए सरणी में। । दो प्रतियाँ आमतौर पर एक वस्तु निर्माण की तुलना में तेज़ होती हैं, इसलिए ArrayBuffer ऐपेंड आमतौर पर सूची प्रस्तुत करता है।
रेक्स केर

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