यह शैली और वरीयता का एक सवाल है लेकिन यहां जाता है: मुझे स्कैला का उपयोग कब करना चाहिए। अरे? मैं हर समय सूची का उपयोग करता हूं और कभी-कभी सेक, मानचित्र और इसी तरह से चलाता हूं, लेकिन मैंने जंगली में कभी भी उपयोग नहीं किया और न ही देखा। क्या यह सिर्फ जावा संगतता के लिए है? क्या मुझे एक आम उपयोग-मामला याद आ रहा है?मुझे अन्य संग्रहों में से किसी एक के बजाय स्कैला के ऐरे का उपयोग कब करना चाहिए?
उत्तर
सबसे पहले, आइए यहां अस्वीकरण करें। स्कैला 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
का उपयोग करें। साथ ही, यदि आप अपने सभी तरीकों के साथ एक सच्चे संग्रह चाहते हैं, तो आप निहित रूपांतरणों के आधार पर इसका भी उपयोग करना चाहेंगे।
यदि आप अपरिवर्तनीयता चाहते हैं या यदि आपको संलग्न करने, प्रीपेड करने, डालने या हटाने के लिए अच्छा प्रदर्शन की आवश्यकता है, तो कुछ अन्य संग्रह देखें।
धन्यवाद, डैनियल, यह एक अच्छा जवाब है। – pr1001
एक सरणी उचित है जब आपके पास समान (या संगत) वर्ग की कई वस्तुएं हों, और आप पहले से ही उन वस्तुओं की सटीक गणना या उचित ऊपरी सीमा के बारे में जानते हैं, और आप तेजी से यादृच्छिक रूप से रुचि रखते हैं वस्तुओं का उपयोग और संभवतः स्थान परिवर्तन, लेकिन इसे स्थापित करने के बाद, आप कभी भी सूची में कहीं से आइटम डालें या हटा नहीं पाएंगे।
या किसी अन्य तरीके से कहा गया है, यह संग्रह प्रकारों की तुलना में कम घंटियाँ और सीटी के साथ एक समग्र डेटा संरचना है, जिसका उपयोग थोड़ा सा ओवरहेड और थोड़ा बेहतर प्रदर्शन के साथ किया जाता है।
एक बहुत ही विकसित उदाहरण: आप कार्यों के उत्पादन के व्यवसाय में हैं, और इन कार्यों के लिए गुणवत्ता परीक्षण में 1000 निश्चित इनपुट मानों के सेट के लिए उनके प्रदर्शन या परिणाम की जांच शामिल है। इसके अलावा, आप इन मानों को फ़ाइल में न रखने का निर्णय लेते हैं, बल्कि आप उन्हें अपने प्रोग्राम में हार्ड कोड देते हैं। एक सरणी उचित होगी।
जावा एपीआई के साथ इंटरफेसिंग एक मामला है। जावा सरणी स्केल एरे के विपरीत भी इनवेरिएंट हैं और इसलिए इसकी वजह से सूचियों पर कोई फायदा नहीं होता है।
- 1. मुझे हैश के बजाय ओपनस्ट्रक्चर का उपयोग कब करना चाहिए?
- 2. मुझे UIImagePickerControllerSourceTypePhotoLibrary का उपयोग UIImagePickerControllerSourceTypeSavedPhotosAlbum के बजाय कब करना चाहिए?
- 3. मुझे इनलाइन के बजाय __forceinline का उपयोग कब करना चाहिए?
- 4. मुझे fprintf के बजाय fputs का उपयोग कब करना चाहिए?
- 5. एसपीएल बनाम ऐरे: हमें एसपीएल का उपयोग कब करना चाहिए और हमें PHP में ऐरे का उपयोग कब करना चाहिए?
- 6. मुझे सेफफोर्स का उपयोग कब करना चाहिए?
- 7. मुझे किसी पृष्ठ के बजाय UserControl का उपयोग कब करना चाहिए?
- 8. मुझे std_logic_vector का उपयोग कब करना चाहिए और मुझे अन्य डेटा प्रकारों का उपयोग कब करना चाहिए?
- 9. मुझे पैरामीटर का उपयोग कब करना चाहिए?
- 10. सी # मुझे सूची का उपयोग कब करना चाहिए और मुझे सरणीसूची का उपयोग कब करना चाहिए?
- 11. स्ट्रिंगस्ट्रीम के बजाय स्ट्रिंग का उपयोग कब करना चाहिए?
- 12. क्या मुझे MySQL के बजाय NoSQL का उपयोग करना चाहिए?
- 13. मुझे CompiledQuery का उपयोग कब करना चाहिए?
- 14. मुझे _aligned_malloc() का उपयोग कब करना चाहिए?
- 15. मुझे ConcurrentSkipListMap का उपयोग कब करना चाहिए?
- 16. मुझे GC.SuppressFinalize() का उपयोग कब करना चाहिए?
- 17. जावा में, मुझे जेनेरिक के बजाय "ऑब्जेक्ट ओ" का उपयोग कब करना चाहिए?
- 18. मुझे स्कैला की @inline एनोटेशन का उपयोग कब करना चाहिए (और मुझे नहीं चाहिए)?
- 19. मुझे कब और क्यों एक शब्दकोश के बजाय नामांकित का उपयोग करना चाहिए?
- 20. मुझे पॉइंटर्स के वेक्टर की बजाय ऑब्जेक्ट्स के वेक्टर का उपयोग कब करना चाहिए?
- 21. मुझे जीडब्ल्यूटी के बजाय jQuery का उपयोग क्यों करना चाहिए?
- 22. PHP में गूंजने के बजाय मुझे प्रिंट का उपयोग कब करना चाहिए?
- 23. मुझे पर्ल के ऑटोोलॉड का उपयोग कब करना चाहिए?
- 24. मुझे रेगेक्स में \ A का उपयोग कब करना चाहिए?
- 25. मुझे concatenation ऑपरेटर के बजाय String.Format या String.Concat का उपयोग कब करना चाहिए?
- 26. किसी को वेब एप्लिकेशन में POST के बजाय GET का उपयोग कब करना चाहिए?
- 27. मुझे लूप लूप के बजाय मानचित्र का उपयोग कब करना चाहिए?
- 28. (कब) मुझे PHP में टाइप संकेत का उपयोग करना चाहिए?
- 29. उद्देश्य-सी में, मुझे कक्षा विधियों का उपयोग कब करना चाहिए और मुझे उदाहरण विधियों का उपयोग कब करना चाहिए?
- 30. मुझे अपने प्रश्नों में लेनदेन का उपयोग कब करना चाहिए?
क्या मुझे इसे एक समुदाय विकी बनाना चाहिए? – pr1001
मुझे ऐसा नहीं लगता है। स्कैला के ऐरे का उपयोग करने के पेशेवरों और विपक्ष बहुत अच्छी तरह से परिभाषित हैं, और निष्पक्ष रूप से तर्क दिया जा सकता है। सवाल आवाज है, आईएमएचओ। –