Bagaimana cara menyalin daftar di Kotlin?
saya menggunakan
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
Apakah ada cara yang lebih mudah?
Bagaimana cara menyalin daftar di Kotlin?
saya menggunakan
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
Apakah ada cara yang lebih mudah?
Jawaban:
Ini bekerja dengan baik.
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()juga berfungsi karena memanggil toMutableList()dalam implementasinya.
===dan harus mengatakan toList()tidak menyalin koleksinya, tetapi toMutableList()melakukannya
Iterable.toList()kembalikan emptyList(), yang selalu mengembalikan objek yang sama (tidak dapat diubah). Jadi jika Anda menguji dengan emptyList()Anda akan mendapatkan kembali objek yang sama.
toMutableList()akan mengembalikan contoh baru dari daftar jika contoh yang memanggil metode sudah daftar yang bisa berubah.
Kamu bisa memakai
Daftar -> toList ()
Array -> toArray ()
ArrayList -> toArray ()
MutableList -> toMutableList ()
Contoh:
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())
cetak log:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
Saya dapat menemukan dua cara alternatif:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
Pembaruan: dengan mesin Jenis Inferensi baru (ikut serta di Kotlin 1.3), Kita dapat menghilangkan parameter jenis umum pada contoh pertama dan memiliki ini:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
FYI. Cara untuk mengikutsertakan Inferensi baru adalah kotlinc -Xnew-inference ./SourceCode.ktuntuk baris perintah, atau kotlin { experimental { newInference 'enable'}untuk Gradle. Untuk info lebih lanjut tentang Inferensi Jenis baru, lihat video ini: KotlinConf 2018 - Inferensi Jenis Baru dan Fitur Bahasa Terkait oleh Svetlana Isakova , terutama 'inferensi untuk pembangun' di 30 '
Jika daftar Anda menyimpan kelas data kotlin , Anda bisa melakukan ini
selectedSeries = ArrayList(series.map { it.copy() })
Anda dapat menggunakan ekstensi Iterable.toMutableList()yang disediakan yang akan memberi Anda daftar baru. Sayangnya, seperti yang disarankan oleh tanda tangan dan dokumentasinya , ini dimaksudkan untuk memastikan bahwa an Iterableadalah List(seperti toStringdan banyak to<type>metode lainnya ). Tidak ada yang menjamin Anda bahwa ini akan menjadi daftar baru . Misalnya, menambahkan baris berikut di awal ekstensi: if (this is List) return thisadalah peningkatan kinerja yang sah (jika memang meningkatkan kinerja).
Juga, karena namanya, kode yang dihasilkan tidak terlalu jelas.
Saya lebih suka menambahkan ekstensi saya sendiri untuk memastikan hasilnya dan membuat kode yang jauh lebih jelas (seperti yang kita miliki untuk array ):
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) }
}
Perhatikan bahwa addAllini adalah cara tercepat untuk menyalin karena menggunakan native System.arraycopydalam implementasi ArrayList.
Juga, berhati-hatilah karena ini hanya akan memberi Anda salinan yang dangkal .
addAll(this@copyOf), karena thisinside applyakan mengacu pada daftar kosong yang baru dibuat? Apakah itu atau mutableListOf<T>().also { it.addAll(this) }?
Untuk salinan yang dangkal, saya sarankan
.map{it}
Itu akan berfungsi untuk banyak jenis koleksi.
Maps. Ini mengkompilasi, tetapi karena itadalah a Map.Entry, dan salinannya dangkal, Anda memiliki entri yang sama.
Seperti di Jawa:
Daftar:
val list = mutableListOf("a", "b", "c")
val list2 = ArrayList(list)
Peta:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val map2 = HashMap(map)
Dengan asumsi Anda menargetkan JVM (atau Android); Saya tidak yakin ini berfungsi untuk target lain, karena bergantung pada konstruktor salinan ArrayList dan HashMap.
Saya akan menggunakan satu toCollection()metode ekstensi :
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
Ini akan membuat yang baru MutableListdan kemudian menambahkan setiap elemen asli ke daftar yang baru dibuat.
Jenis yang disimpulkan di sini adalah MutableList<String>. Jika Anda tidak ingin mengekspos mutabilitas daftar baru ini, Anda dapat mendeklarasikan tipe secara eksplisit sebagai daftar yang tidak dapat diubah:
val copy: List<String> = original.toCollection(mutableListOf())
Untuk daftar sederhana memiliki banyak solusi tepat di atas.
Namun, ini hanya untuk daftar yang dangkal.
Fungsi di bawah ini berfungsi untuk 2 dimensi apa pun ArrayList. ArrayListadalah, dalam praktiknya, setara dengan MutableList. Menariknya, ini tidak berfungsi saat menggunakan MutableListtipe eksplisit . Jika seseorang membutuhkan lebih banyak dimensi, itu perlu membuat lebih banyak fungsi.
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
}
Demo untuk Matriks integer:
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])
itu menunjukkan 12
Anda dapat menggunakan ArrayListkonstruktor:ArrayList(list)