Kotlin'de liste nasıl kopyalanır?
kullanıyorum
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
Daha kolay bir yol var mı?
Kotlin'de liste nasıl kopyalanır?
kullanıyorum
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
Daha kolay bir yol var mı?
Yanıtlar:
Bu iyi çalışıyor.
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()
ayrıca çalışır çünkü toMutableList()
uygulanmasını çağırır .
===
ve toList()
koleksiyonu kopyalamadığını söylemeliyim , ama toMutableList()
yapıyor
Iterable.toList()
döner emptyList()
her zaman aynı (iletmenin) nesnesi geri döndürür. Yani eğer test emptyList()
ederseniz aynı nesneyi geri alırsınız.
toMutableList()
döndüren durumu , "Bu koleksiyonun tüm öğeleriyle dolu yeni bir MutableList döndürür."
Kullanabilirsiniz
Liste -> toList ()
Dizi -> toArray ()
ArrayList -> toArray ()
MutableList -> toMutableList ()
Misal:
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())
yazdırma günlüğü:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
İki alternatif yol bulabilirim:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
Güncelleme: Yeni Type Inference motoru ile (Kotlin 1.3'e dahil), 1. örnekte jenerik tip parametresini çıkarabiliriz ve buna sahip olabiliriz:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
Bilginize: Yeni Çıkarımı etkinleştirmenin yolu kotlinc -Xnew-inference ./SourceCode.kt
komut satırı veya kotlin { experimental { newInference 'enable'}
Gradle içindir. Yeni Tip Çıkarımı hakkında daha fazla bilgi için şu videoyu izleyin: KotlinConf 2018 - Svetlana Isakova'dan Yeni Tip Çıkarımı ve İlgili Dil Özellikleri , özellikle 30'da 'inşaatçılar için çıkarım'
Listeniz kotlin veri sınıfına sahipse , bunu yapabilirsiniz
selectedSeries = ArrayList(series.map { it.copy() })
Size Iterable.toMutableList()
yeni bir liste sağlayacak olan sağlanan uzantıyı kullanabilirsiniz . Ne yazık ki, imzası ve belgelerinin önerdiği gibi, an'ın Iterable
a List
(aynı toString
ve diğer birçok to<type>
yöntem gibi) olduğundan emin olmak içindir . Hiçbir şey size yeni bir liste olacağını garanti etmez . Örneğin, uzantının başına aşağıdaki satırı eklemek: if (this is List) return this
meşru bir performans iyileştirmesidir (eğer gerçekten performansı iyileştiriyorsa).
Ayrıca, adı nedeniyle ortaya çıkan kod çok net değildir.
Sonuçtan emin olmak ve çok daha net bir kod oluşturmak için kendi uzantımı eklemeyi tercih ediyorum (tıpkı diziler için olduğu gibi ):
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) }
}
Not addAll
o yerli kullandığı için kopyalamak için en hızlı yoldur System.arraycopy
uygulanmasında ArrayList
.
Ayrıca, bunun size yalnızca sığ bir kopya vereceğine dikkat edin .
addAll(this@copyOf)
, çünkü this
içeride apply
yeni oluşturulan boş listeye atıfta bulunulacak mı? Ya öyle mutableListOf<T>().also { it.addAll(this) }
mi?
Sığ bir kopya için öneririm
.map{it}
Bu, birçok koleksiyon türü için işe yarayacak.
Map
S için çalışmadığını unutmayın . Derler, ancak it
a Map.Entry
olduğu ve kopya sığ olduğu için, aynı girişlere sahipsiniz.
Tıpkı Java'da olduğu gibi:
Liste:
val list = mutableListOf("a", "b", "c")
val list2 = ArrayList(list)
Harita:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val map2 = HashMap(map)
JVM'yi (veya Android'i) hedeflediğinizi varsayarsak; Diğer hedefler için çalıştığından emin değilim, çünkü ArrayList ve HashMap'in kopya yapıcılarına dayanıyor.
Ben kullanacağı uzatma yöntemi :toCollection()
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
Bu, yeni bir tane oluşturacak MutableList
ve ardından orijinalin her bir öğesini yeni oluşturulan listeye ekleyecektir.
Buradaki çıkarsama türü olacaktır MutableList<String>
. Bu yeni listenin değişkenliğini ortaya çıkarmak istemiyorsanız, türü açıkça değişmez bir liste olarak bildirebilirsiniz:
val copy: List<String> = original.toCollection(mutableListOf())
Yapıcıyı kullanabilirsiniz ArrayList
:ArrayList(list)
Basit listeler için yukarıda birçok doğru çözüm vardır.
Ancak, sadece sığ listeler içindir.
Aşağıdaki fonksiyon herhangi bir 2 boyutlu için çalışır ArrayList
. ArrayList
pratikte eşdeğerdir MutableList
. İlginç bir şekilde, açık MutableList
tip kullanıldığında işe yaramıyor . Daha fazla boyuta ihtiyaç varsa, daha fazla işlev yapmak gerekir.
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
}
Tamsayı Matrisi için demo:
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])
gösteriyor 12