Как клонировать или копировать список в kotlin

Как скопировать список в Котлин?

я использую

val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)

Есть ли более простой способ?

Ответ 1

Это отлично работает.

val selectedSeries = series.toMutableList()

Ответ 2

Я могу придумать два альтернативных способа:

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 "

Ответ 3

Вы можете использовать

Список → 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

Ответ 4

Если ваш список содержит класс данных kotlin, вы можете сделать это

selectedSeries = ArrayList(series.map { it.copy() })

Ответ 5

Для мелкой копии, я предлагаю

.map{it}

Это будет работать для многих типов коллекций.

Ответ 6

Я бы использовал метод расширения toCollection():

val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())

Это создаст новый MutableList, а затем добавит каждый элемент оригинала во вновь созданный список.

Предполагаемый тип здесь будет MutableList<String>. Если вы не хотите показывать изменчивость этого нового списка, вы можете явно объявить тип как неизменяемый список:

val copy: List<String> = original.toCollection(mutableListOf())

Ответ 7

Как в 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.

Ответ 8

Для простых списков есть много правильных решений выше.

Тем не менее, это только для отмелей списков.

Приведенная ниже функция работает для любых двухмерных 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

Ответ 9

Я попробовал это:

    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, тот же результат, когда менял член таким образом.