Кто когда-либо говорил, что копирование списка также должно создавать новые копии объектов? Не должно. Этот вопрос касается только копирования списка (нового экземпляра списка), но оба списка, конечно, должны содержать одинаковые объекты. В каких случаях вам нужно копировать объекты? Вам лучше задать новый вопрос, если вам это действительно нужно ...

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

я использую

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

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

Ответы на вопрос(6)

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

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

 Boy28 янв. 2019 г., 09:14
Я хотел отметить, что он создает копию ссылок только в том случае, если объекты в списке не являются примитивами. Это также не работает дляdata classчто я нахожу очень странным, потому что я ожидалtoMutableList() вызвал бы функцию копирования. Может быть, вы можете объяснить, почему это не работает (я еще не изучал это)
 user2528 янв. 2019 г., 12:33
Кто когда-либо говорил, что копирование списка также должно создавать новые копии объектов? Не должно. Этот вопрос касается только копирования списка (нового экземпляра списка), но оба списка, конечно, должны содержать одинаковые объекты. В каких случаях вам нужно копировать объекты? Вам лучше задать новый вопрос, если вам это действительно нужно ...
 user2527 янв. 2019 г., 01:55
И что вы пытались сделать в своем примере? Вы сделали копию спискаb (вc), но оба списка, конечно, имеют ссылку на один и тот жеa список, потому что вы не сделали копиюa (если это то, что вы хотели). Чего ты хочешь достичь? Если вы программируете на Java, вы должны понимать, как работают ссылки на объекты, так как разные списки могут содержать ссылку на один и тот же объект.
 user2527 янв. 2019 г., 01:02
 user2527 янв. 2019 г., 00:52
работает нормальноval a = mutableListOf(1, 2, 3) ...val b = a.toMutableList() ...b[0] = 6 ...Log.i(TAG, "tests ${a[0]} ${b[0]}") // prints "1 6" so it works totally fine

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 лет

 Jacob Wu26 окт. 2018 г., 01:08
@Lensflare Я думаю, что выгода заключается только в синтаксисе - код короткий, и не требуется явного универсального типа (как в моем первом примере). Я думаю, что за кулисами код скомпилирован для операций с массивами, поэтому производительность должна быть одинаковой.
 Lensflare24 окт. 2018 г., 18:08
@Jacob Wu: Я был удивлен, увидев, что символ * во втором решении не выдает ошибку. Что оно делает? Я сделал поиск с «одинарным умножением», но ничего не нашел.
 Jacob Wu25 окт. 2018 г., 06:28
@Lensflare * означает разделение массива на отдельные элементы, например, mutableListOf (* [1, 2, 3]) означает mutableListOf (1, 2, 3), это как операция, противоположная vararg
 Holger Brandl29 авг. 2018 г., 10:37
Имхо следует разделить на 2 ответа, так как я думаю, что первый является правильным, но последний испытывает недостаток в некоторой красоте.
 Lensflare25 окт. 2018 г., 10:26
@Jacob Wu: Спасибо. С вашим ответом мне удалось выяснить, что оператор называется «оператор спреда». Я вижу, как это помогает, объединяя некоторые параметры с массивом в список varargs. Но какая польза от этого в вашем примере? Это быстрее или что-то? Или это ключ к тому, чтобы коллекция была скопирована?

Это работает для меня

selectedSeries = ArrayList(series.map { it.copy() })
Решение Вопроса

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

val selectedSeries = series.toMutableList()
 Peppermint Paddy02 апр. 2018 г., 13:27
@ FlávioFaria только что проверил это с=== и должен сказатьtoList() не копирует коллекцию, ноtoMutableList() делает
 Flávio Faria01 февр. 2018 г., 21:19
val selectedSeries = series.toList() также работает, потому что это вызываетtoMutableList() в его реализации.
 BrunoJCM02 июн. 2018 г., 09:32
Мне лично не нравится эта идея ... Ничто в документах не допускает, чтоtoMutableList() должен вернуть новый экземпляр списка, если экземпляр, вызывающий метод, уже является изменяемым списком.
 Bhargav12 июн. 2018 г., 11:37
это не хороший ответ и, безусловно, неправильный, нет никакой гарантии, что будущие реализации могут измениться, если специально не задокументировано, что этот вызов метода всегда будет возвращать новую копию.
 Laurence Gonsalves27 апр. 2018 г., 00:06
@PeppermintPaddy Itделает копия, кроме случаев пустых списков. Если источник пуст,Iterable.toList() возвращаетсяemptyList(), который всегда возвращает один и тот же (неизменный) объект. Так что если вы тестируете сemptyList() вы получите тот же объект обратно.

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

.map{it}

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

List -> toList ()

Array -> toArray ()

ArrayList -> toArray ()

MutableList -> toMutableList ()

Пример:

val array:ArrayList<String> = ArrayList()
array.add("1")
array.add("2")
array.add("3")
array.add("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

Ваш ответ на вопрос