कहो मेरे पास एक Array[Int]
पसंद है
val array = Array( 1, 2, 3 )
अब मैं एक तत्व को सरणी में जोड़ना चाहूंगा, मान कहें 4
, जैसा कि निम्नलिखित उदाहरण में है:
val array2 = array + 4 // will not compile
मैं निश्चित रूप से इसका उपयोग कर सकता हूं System.arraycopy()
और अपने दम पर कर सकता हूं, लेकिन इसके लिए एक स्काला लाइब्रेरी फ़ंक्शन होना चाहिए, जो मुझे बस नहीं मिला। किसी भी संकेत के लिए धन्यवाद!
टिप्पणियाँ:
मुझे पता है कि मैं निम्नलिखित पंक्ति में जैसे तत्वों के एक और सरणी को जोड़ सकता हूं, लेकिन यह भी गोल-गोल लगता है:
val array2b = array ++ Array( 4 ) // this works
मुझे सूची बनाम एरे के फायदों और कमियों के बारे में पता है और यहां मैं विभिन्न कारणों से हूं जो विशेष रूप से एक ऐरे को बढ़ाने में रुचि रखते हैं।
संपादित करें 1
:+
ऑपरेटर विधि की ओर इशारा करते हुए उत्तर के लिए धन्यवाद । यह वही है जिसे मैं देख रहा था। दुर्भाग्य से, यह एक कस्टम परिशिष्ट () विधि के उपयोग से धीमी है arraycopy
- लगभग दो से तीन गुना धीमी। में कार्यान्वयन को देखते हुए SeqLike[]
, एक बिल्डर बनाया जाता है, फिर उसके साथ सरणी को जोड़ा जाता है, फिर बिल्डर के माध्यम से एपेंड किया जाता है, फिर बिल्डर को प्रदान किया जाता है। सरणियों के लिए एक अच्छा कार्यान्वयन नहीं है। मैंने दो तरीकों की तुलना करते हुए एक त्वरित बेंचमार्क किया, दस चक्रों में से सबसे तेज़ समय को देखते हुए। एकल-आइटम परिशिष्ट के 10 मिलियन पुनरावृत्तियों को किसी वर्ग के 8-तत्व सरणी उदाहरण के लिए Foo
3.1 सेकंड के साथ :+
और 1.7 सेकंड append()
का उपयोग करना आसान विधि के साथ होता हैSystem.arraycopy();
लांग के 8-तत्व सरणियों पर 10 मिलियन एकल-आइटम परिशिष्ट पुनरावृत्ति करना 2.1 सेकंड के साथ :+
और 0.78 सेकंड सरल append()
विधि के साथ लेता है । आश्चर्य है कि अगर यह पुस्तकालय में कस्टम कार्यान्वयन के लिए तय नहीं किया जा सकता है Array
?
संपादित करें २
इसके लायक क्या है, मैंने एक टिकट दायर किया: https://issues.scala-lang.org/browse/SI-5017
System.arraycopy(...)
प्रतिस्थापित किया जाता हैArray.copy(...)
ArrayBuffer
जिसका उपयोग अंतिम परिशिष्ट के बाद एक सरणी (के साथ toArray
) में परिवर्तित हो जाता है ?
ArrayBuffer
और उसकी+=
विधि क्यों नहीं ? यह आपको परिशोधित ओ (1) परिशिष्ट देगा।