কোটলিনে কীভাবে তালিকা কপি করবেন?
আমি ব্যাবহার করছি
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
কোন সহজ উপায় আছে?
কোটলিনে কীভাবে তালিকা কপি করবেন?
আমি ব্যাবহার করছি
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
কোন সহজ উপায় আছে?
উত্তর:
এটি কাজ করে।
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()এটি কার্যকর করে কারণ এটি toMutableList()এর বাস্তবায়নে কল করে।
===এবং toList()সংগ্রহটি অনুলিপি করেন না, তবে toMutableList()করেন
Iterable.toList()ফেরত দেয় emptyList(), যা সর্বদা একই (অপরিবর্তনীয়) বস্তুটি দেয়। সুতরাং আপনি যদি পরীক্ষা করে emptyList()দেখেন তবে একই জিনিসটি ফিরে পাবেন।
toMutableList()একটি নতুন তালিকা ফিরে আসে , "এই সংগ্রহের সমস্ত উপাদান দিয়ে ভরাট নতুন মিউটেবললিস্ট ফিরিয়ে দেয়"।
তুমি ব্যবহার করতে পার
তালিকা -> টু লিস্ট ()
অ্যারে -> টু অ্যারে ()
অ্যারেলিস্ট -> টু অ্যারে ()
পরিবর্তনীয় তালিকা -> থেকে পরিবর্তনযোগ্য তালিকা ()
উদাহরণ:
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. val selectedSeries = mutableListOf().apply { addAll(series) }
FYI. নতুন ইনফারেন্সটি বেছে নেওয়ার উপায় হ'ল kotlinc -Xnew-inference ./SourceCode.ktকমান্ড লাইন বা kotlin { experimental { newInference 'enable'}গ্রেডল for নতুন টাইপ অনুমান সম্পর্কে আরও তথ্যের জন্য, এই ভিডিওটি দেখুন: কোটলিনকনফ 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}
এটি বিভিন্ন ধরণের সংগ্রহের জন্য কাজ করবে।
Maps এর জন্য কাজ করে না । এটি সংকলন করে, তবে যেহেতু এটি itএকটি 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)
ধরে নিচ্ছেন আপনি জেভিএম (বা অ্যান্ড্রয়েড) কে টার্গেট করছেন; আমি নিশ্চিত নই যে এটি অন্যান্য লক্ষ্যগুলির জন্য কাজ করে, কারণ এটি অ্যারেলিস্ট এবং হ্যাশম্যাপের অনুলিপি নির্মাণকারীদের উপর নির্ভর করে।
আমি ব্যবহার করেন এক্সটেনশন পদ্ধতি :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