¿Cómo copiar la lista en Kotlin?
Estoy usando
val selectedSeries = mutableListOf<String>() selectedSeries.addAll(series)¿Hay una manera más fácil?
var oldList: List<ClassA>? val newList = oldList.map { it.copy() }Después de probar la copia superficial, la clonación de copia profunda y muchas más, encontré esta solución que seguramente funcionará para usted.
val iterator: Iterator<Object> = yourList.iterator() while (iterator.hasNext()) newList.add(iterator.next().copy())val selectedSeries = listOf(*series.toTypedArray())
Puede usar el constructor ArrayList : ArrayList(list)
Para listas simples tiene muchas soluciones correctas arriba.
Sin embargo, es solo para listas poco profundas.
La siguiente función funciona para cualquier ArrayList bidimensional. ArrayList es, en la práctica, equivalente a MutableList . Curiosamente, no funciona cuando se usa el tipo MutableList explícito. Si se necesitan más dimensiones, es necesario hacer más funciones.
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 }Demostración para matriz entera:
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]) muestra 12
Pruebe el siguiente código para copiar la lista en Kotlin
arrayList2.addAll(arrayList1.filterNotNull())Puede usar la extensión provista Iterable.toMutableList() que le proporcionará una nueva lista. Desafortunadamente, como sugieren su firma y documentación , está destinado a garantizar que un Iterable sea una List (al igual que toString y muchos otros métodos to<type> ). Nada te garantiza que vaya a ser una lista nueva . Por ejemplo, agregar la siguiente línea al comienzo de la extensión: if (this is List) return this es una mejora de rendimiento legítima (si es que realmente mejora el rendimiento).
Además, debido a su nombre, el código resultante no es muy claro.
Prefiero agregar mi propia extensión para estar seguro del resultado y crear un código mucho más claro (al igual que tenemos para las matrices ):
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) } } Tenga en cuenta que addAll es la forma más rápida de copiar porque usa el System.arraycopy nativo en la implementación de ArrayList .
Además, tenga en cuenta que esto solo le dará una copia superficial .
EDITAR:
Es posible que desee utilizar la versión más genérica:
fun <T> Collection<T>.copyOf(): Collection<T> { val original = this return mutableListOf<T>().apply { addAll(original) } } fun <T> Collection<T>.mutableCopyOf(): MutableCollection<T> { val original = this return mutableListOf<T>().apply { addAll(original) } }Al igual que en Java:
Lista:
val list = mutableListOf("a", "b", "c") val list2 = ArrayList(list)Mapa:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3) val map2 = HashMap(map)Suponiendo que está apuntando a la JVM (o Android); No estoy seguro de que funcione para otros objetivos, ya que depende de los constructores de copias de ArrayList y HashMap.
Usaría el método de extensión toCollection() :
val original = listOf("A", "B", "C") val copy = original.toCollection(mutableListOf()) Esto creará una nueva MutableList y luego agregará cada elemento del original a la lista recién creada.
El tipo inferido aquí será MutableList<String> . Si no quiere exponer la mutabilidad de esta nueva lista, puede declarar el tipo explícitamente como una lista inmutable:
val copy: List<String> = original.toCollection(mutableListOf())Esto funciona bien.
val selectedSeries = series.toMutableList()Puedo pensar en dos formas alternativas:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) } 2. val selectedSeries = mutableListOf(*series.toTypedArray())Actualización: con el nuevo motor de inferencia de tipos (opt-in en Kotlin 1.3), podemos omitir el parámetro de tipo genérico en el primer ejemplo y tener esto:
1. val selectedSeries = mutableListOf().apply { addAll(series) } FYI.La forma de optar por una nueva inferencia es kotlinc -Xnew-inference ./SourceCode.kt para la línea de comandos, o kotlin { experimental { newInference 'enable'} para Gradle. Para obtener más información sobre la nueva Inferencia de tipos, consulte este video: KotlinConf 2018 - Nuevas funciones de inferencia de tipos y lenguaje relacionado por Svetlana Isakova , especialmente 'inferencia para constructores' en 30'
Si su lista contiene la clase de datos kotlin , puede hacer esto
selectedSeries = ArrayList(series.map { it.copy() })Puedes usar
Lista -> aLista()
Matriz -> a Matriz()
ArrayList -> toArray()
MutableList -> toMutableList()
Ejemplo:
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())registro de impresión:
array: 4 arrayCopy: 4 array after remove: 3 arrayCopy after remove: 4Para una copia superficial, sugiero
.map{it}Eso funcionará para muchos tipos de colección.