2009-11-24 3 views
8

यह शैली और वरीयता का एक सवाल है लेकिन यहां जाता है: मुझे स्कैला का उपयोग कब करना चाहिए। अरे? मैं हर समय सूची का उपयोग करता हूं और कभी-कभी सेक, मानचित्र और इसी तरह से चलाता हूं, लेकिन मैंने जंगली में कभी भी उपयोग नहीं किया और न ही देखा। क्या यह सिर्फ जावा संगतता के लिए है? क्या मुझे एक आम उपयोग-मामला याद आ रहा है?मुझे अन्य संग्रहों में से किसी एक के बजाय स्कैला के ऐरे का उपयोग कब करना चाहिए?

+0

क्या मुझे इसे एक समुदाय विकी बनाना चाहिए? – pr1001

+1

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

उत्तर

12

सबसे पहले, आइए यहां अस्वीकरण करें। स्कैला 2.7 का Array एक ही समय में जावा Array और एक स्कैला संग्रह होने का प्रयास करता है। यह ज्यादातर सफल होता है, लेकिन कुछ कोने के मामलों में दोनों में विफल रहता है। दुर्भाग्यवश, इन कोने के मामले सामान्य कोड वाले अच्छे लोगों के साथ हो सकते हैं, इसलिए स्कैला 2.8 उस से निकल रहा है।

स्कैला 2.8 पर, Array है, जो जावा Array है। इसका मतलब है कि यह एक संगत मेमोरी स्पेस है, जो संदर्भ या प्राइमेटिव्स को संग्रहीत करता है (और इसलिए, अलग-अलग तत्व आकार हो सकते हैं), और यादृच्छिक रूप से बहुत तेजी से पहुंचा जा सकता है। इसमें लुभावनी विधियां भी हैं, एक भयानक toString कार्यान्वयन, और एक ही समय में जेनेरिक और प्राइमेटिव का उपयोग करते समय बुरी तरह प्रदर्शन करता है (उदाहरण: def f[T](a: Array[T]) = ...; f(Array(1,2,3)))।

और फिर, GenericArray है, जो एक Array द्वारा समर्थित स्कैला संग्रह है। यह हमेशा बॉक्सिंग प्राइमेटिव स्टोर करता है, इसलिए प्राइमेटिव्स और जेनेरिक मिश्रण करते समय इसमें प्रदर्शन की समस्या नहीं होती है, लेकिन दूसरी तरफ, इसमें पूरी तरह से आदिम (गैर-जेनेरिक) आदिम सरणी का प्रदर्शन लाभ नहीं होता है।

तो, कब उपयोग करें? एक Array निम्नलिखित विशेषताएं हैं:

  • हे (1) यादृच्छिक पढ़ने और लिखने
  • हे (एन) संलग्न/बढ़ाएँ/सम्मिलित करें/हटाएं
  • परिवर्तनशील

ऐसा न करने पर जेनरिक की आवश्यकता है, या आपके जेनेरिक को [T <: AnyRef] के रूप में वर्णित किया जा सकता है, इस प्रकार प्राइमेटिव को छोड़कर, जो AnyVal हैं, और ये विशेषताएं आपके कोड के लिए इष्टतम हैं, फिर इसके लिए जाएं।

यदि आपको प्राइमेटिव सहित जेनरिक की आवश्यकता है, और वे विशेषताएं आपके कोड के लिए इष्टतम हैं, तो स्कैला 2.8 पर GenericArray का उपयोग करें। साथ ही, यदि आप अपने सभी तरीकों के साथ एक सच्चे संग्रह चाहते हैं, तो आप निहित रूपांतरणों के आधार पर इसका भी उपयोग करना चाहेंगे।

यदि आप अपरिवर्तनीयता चाहते हैं या यदि आपको संलग्न करने, प्रीपेड करने, डालने या हटाने के लिए अच्छा प्रदर्शन की आवश्यकता है, तो कुछ अन्य संग्रह देखें।

+0

धन्यवाद, डैनियल, यह एक अच्छा जवाब है। – pr1001

3

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

या किसी अन्य तरीके से कहा गया है, यह संग्रह प्रकारों की तुलना में कम घंटियाँ और सीटी के साथ एक समग्र डेटा संरचना है, जिसका उपयोग थोड़ा सा ओवरहेड और थोड़ा बेहतर प्रदर्शन के साथ किया जाता है।

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

3

जावा एपीआई के साथ इंटरफेसिंग एक मामला है। जावा सरणी स्केल एरे के विपरीत भी इनवेरिएंट हैं और इसलिए इसकी वजह से सूचियों पर कोई फायदा नहीं होता है।

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

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