कोटलिन में सूची की प्रतिलिपि कैसे करें?
मैं उपयोग कर रहा हूँ
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
क्या कोई आसान तरीका है?
जवाबों:
यह ठीक काम करता है।
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()
यह भी काम करता है क्योंकि यह toMutableList()
इसके कार्यान्वयन में कहता है।
===
और कहना toList()
है कि संग्रह को कॉपी नहीं करता है, लेकिन toMutableList()
करता है
Iterable.toList()
रिटर्न emptyList()
, जो हमेशा एक ही (अपरिवर्तनीय) वस्तु देता है। इसलिए यदि आप परीक्षण करते हैं emptyList()
तो आपको वही वस्तु वापस मिल जाएगी।
toMutableList()
एक नई सूची देता है , "इस संग्रह के सभी तत्वों से भरा एक नया MutableList देता है।"
आप उपयोग कर सकते हैं
सूची -> सूची ()
ऐरे -> ऐरे ()
ArrayList -> toArray ()
म्यूटेबलिस्ट -> म्यूटेबलिस्ट ()
उदाहरण:
val array = arrayListOf("1", "2", "3", "4")
val arrayCopy = array.toArray() // copy array to other array
Log.i("---> array " , array?.count().toString())
Log.i("---> arrayCopy " , arrayCopy?.count().toString())
array.removeAt(0) // remove first item in array
Log.i("---> array after remove" , array?.count().toString())
Log.i("---> arrayCopy after remove" , arrayCopy?.count().toString())
प्रिंट लॉग:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
मैं दो वैकल्पिक तरीकों से आ सकता हूं:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
अद्यतन: नए प्रकार के आविष्कार इंजन (कोटलिन 1.3 में ऑप्ट) के साथ, हम जेनेरिक प्रकार के पैरामीटर को 1 उदाहरण में छोड़ सकते हैं और यह है:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
FYI करें। नए इंट्रेंस में ऑप्ट-इन करने का तरीका kotlinc -Xnew-inference ./SourceCode.kt
कमांड लाइन के लिए है, या kotlin { experimental { newInference 'enable'}
ग्रैडल के लिए है। नए प्रकार के आविष्कार के बारे में अधिक जानकारी के लिए, इस वीडियो को देखें: KotlinConf 2018 - स्वेतलाना इसकोवा द्वारा नए प्रकार के इंजेक्शन और संबंधित भाषा की विशेषताएं , विशेष रूप से 'बिल्डरों के लिए इंजेक्शन ' 30 पर '
यदि आपकी सूची में कोटलिन डेटा वर्ग है , तो आप ऐसा कर सकते हैं
selectedSeries = ArrayList(series.map { it.copy() })
आप दिए गए एक्सटेंशन का उपयोग कर सकते हैं Iterable.toMutableList()
जो आपको एक नई सूची प्रदान करेगा। दुर्भाग्य से, जैसा कि इसके हस्ताक्षर और प्रलेखन का सुझाव है, यह सुनिश्चित करने के लिए है कि Iterable
ए एक List
(बिल्कुल पसंद है toString
और कई अन्य to<type>
तरीके) है। कुछ भी आपको गारंटी नहीं देता है कि यह एक नई सूची है। उदाहरण के लिए, एक्सटेंशन की शुरुआत में निम्नलिखित पंक्ति जोड़ना: if (this is List) return this
एक वैध प्रदर्शन में सुधार है (यदि यह वास्तव में प्रदर्शन में सुधार करता है)।
इसके नाम के कारण, इसके परिणामस्वरूप कोड बहुत स्पष्ट नहीं है।
मैं परिणाम के बारे में सुनिश्चित करने के लिए अपना स्वयं का एक्सटेंशन जोड़ना पसंद करता हूं और बहुत अधिक स्पष्ट कोड बनाता हूं (जैसे हमारे पास सरणियों के लिए है ):
fun <T> List<T>.copyOf(): List<T> {
val original = this
return mutableListOf<T>().apply { addAll(original) }
}
fun <T> List<T>.mutableCopyOf(): MutableList<T> {
val original = this
return mutableListOf<T>().apply { addAll(original) }
}
ध्यान दें कि addAll
प्रतिलिपि बनाने का सबसे तेज़ तरीका है क्योंकि यह System.arraycopy
कार्यान्वयन में मूल का उपयोग करता है ArrayList
।
इसके अलावा, सावधान रहें कि यह आपको एक उथली प्रति देगा ।
addAll(this@copyOf)
, क्योंकि this
अंदर apply
नई बनाई गई खाली सूची को संदर्भित करेगा? या तो वह या mutableListOf<T>().also { it.addAll(this) }
?
उथली प्रति के लिए, मैं सुझाव देता हूं
.map{it}
यह कई संग्रह प्रकारों के लिए काम करेगा।
Map
। यह संकलित करता है, लेकिन चूंकि it
a है Map.Entry
, और प्रति उथली है, तो आपके पास समान प्रविष्टियां हैं।
जैसे जावा में:
सूची:
val list = mutableListOf("a", "b", "c")
val list2 = ArrayList(list)
नक्शा:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val map2 = HashMap(map)
मान लें कि आप JVM (या Android) को लक्षित कर रहे हैं; मुझे यकीन नहीं है कि यह अन्य लक्ष्यों के लिए काम करता है, क्योंकि यह ArrayList और HashMap के कॉपी कंस्ट्रक्टर्स पर निर्भर करता है।
मैं का प्रयोग करेंगे विस्तार विधि :toCollection()
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
यह एक नया बना देगा MutableList
और फिर मूल के प्रत्येक तत्व को नव-निर्मित सूची में जोड़ देगा।
यहाँ अनुमान प्रकार होगा MutableList<String>
। यदि आप इस नई सूची की परिवर्तनशीलता को उजागर नहीं करना चाहते हैं, तो आप स्पष्ट रूप से एक अपरिवर्तनीय सूची के रूप में घोषित कर सकते हैं:
val copy: List<String> = original.toCollection(mutableListOf())
सरल सूचियों के लिए ऊपर कई सही समाधान हैं।
हालाँकि, यह केवल उथले सूचियों के लिए है।
नीचे दिया गया फ़ंक्शन किसी भी 2 आयामी के लिए काम करता है ArrayList
। ArrayList
व्यवहार में, के बराबर है MutableList
। स्पष्ट MutableList
प्रकार का उपयोग करते समय दिलचस्प रूप से यह काम नहीं करता है । यदि किसी को अधिक आयामों की आवश्यकता है, तो यह आवश्यक है कि अधिक कार्य करें।
fun <T>cloneMatrix(v:ArrayList<ArrayList<T>>):ArrayList<ArrayList<T>>{
var MatrResult = ArrayList<ArrayList<T>>()
for (i in v.indices) MatrResult.add(v[i].clone() as ArrayList<T>)
return MatrResult
}
पूर्णांक मैट्रिक्स के लिए डेमो:
var mat = arrayListOf(arrayListOf<Int>(1,2),arrayListOf<Int>(3,12))
var mat2 = ArrayList<ArrayList<Int>>()
mat2 = cloneMatrix<Int>(mat)
mat2[1][1]=5
println(mat[1][1])
यह दिखाता है 12
आप ArrayList
कंस्ट्रक्टर का उपयोग कर सकते हैं :ArrayList(list)