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.kt
untuk 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 Iterable
adalah List
(seperti toString
dan 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 this
adalah 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 addAll
ini adalah cara tercepat untuk menyalin karena menggunakan native System.arraycopy
dalam implementasi ArrayList
.
Juga, berhati-hatilah karena ini hanya akan memberi Anda salinan yang dangkal .
addAll(this@copyOf)
, karena this
inside apply
akan 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.
Map
s. Ini mengkompilasi, tetapi karena it
adalah 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 MutableList
dan 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
. ArrayList
adalah, dalam praktiknya, setara dengan MutableList
. Menariknya, ini tidak berfungsi saat menggunakan MutableList
tipe 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 ArrayList
konstruktor:ArrayList(list)