Как скопировать список в Котлин?
я использую
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
Есть ли более простой способ?
Как скопировать список в Котлин?
я использую
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
Есть ли более простой способ?
Это отлично работает.
val selectedSeries = series.toMutableList()
Я могу придумать два альтернативных способа:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
Обновление: с новым механизмом вывода типов (подписка в Kotlin 1.3), мы можем опустить параметр универсального типа в первом примере и получить это:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
К вашему сведению. Способ выбора нового вывода - kotlinc -Xnew-inference ./SourceCode.kt
для командной строки или kotlin { experimental { newInference 'enable'}
для Gradle. Для получения дополнительной информации о новом Выводе типов, посмотрите это видео: KotlinConf 2018 - Новые Выводы Типов и Связанные Особенности Языка от Светланы Исаковой, особенно "вывод для строителей" на 30 "
Вы можете использовать
Список → toList()
Array → toArray()
ArrayList → toArray()
MutableList → 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
Если ваш список содержит класс данных kotlin, вы можете сделать это
selectedSeries = ArrayList(series.map { it.copy() })
Для мелкой копии, я предлагаю
.map{it}
Это будет работать для многих типов коллекций.
Я бы использовал метод расширения toCollection()
:
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
Это создаст новый MutableList
, а затем добавит каждый элемент оригинала во вновь созданный список.
Предполагаемый тип здесь будет MutableList<String>
. Если вы не хотите показывать изменчивость этого нового списка, вы можете явно объявить тип как неизменяемый список:
val copy: List<String> = original.toCollection(mutableListOf())
Как в Java:
Список:
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; Я не уверен, что это работает для других целей, так как опирается на конструкторы копирования ArrayList и HashMap.
Для простых списков есть много правильных решений выше.
Тем не менее, это только для отмелей списков.
Приведенная ниже функция работает для любых двухмерных 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
Я попробовал это:
val a = mutableListOf(1, 2, 3)
val b = listOf(a)
val c = b.toMutableList()
c[0][0] = 6
print("b = $b[0]")
print("c = $c[0]")
на обоих отпечатках будет 6
, так что будьте осторожны, это не похоже на копию!
Я также попробовал это с data class
, тот же результат, когда менял член таким образом.