Respuestas:
Esto funciona bien.
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()también funciona porque llama toMutableList()a su implementación.
===y tengo que decir toList()que no copia la colección, pero toMutableList()sí
Iterable.toList()devuelve emptyList(), que siempre devuelve el mismo objeto (inmutable). Entonces, si prueba con emptyList(), obtendrá el mismo objeto.
toMutableList()deba devolver una nueva instancia de una lista si la instancia que llama al método ya es una lista mutable.
Puedes usar
Lista -> toList ()
Matriz -> toArray ()
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: 4
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) }
Para su información, la forma de optar por la nueva Inferencia es kotlinc -Xnew-inference ./SourceCode.ktpara 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 - Nueva inferencia de tipos y características de lenguaje relacionadas de 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() })
Puede utilizar la extensión provista Iterable.toMutableList()que le proporcionará una nueva lista. Desafortunadamente, como sugiere su firma y documentación , está destinado a garantizar que an Iterablees un List(como toStringy muchos otros to<type>métodos). Nada te garantiza que será una nueva lista. Por ejemplo, agregar la siguiente línea al comienzo de la extensión: if (this is List) return thises una mejora legítima del desempeño (si es que realmente mejora el desempeño).
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 (como 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 addAlles la forma más rápida de copiar porque usa el nativo System.arraycopyen la implementación de ArrayList.
Además, tenga en cuenta que esto solo le dará una copia superficial .
addAll(this@copyOf), porque thisdentro applyse referirá a la lista vacía recién creada? ¿O eso o mutableListOf<T>().also { it.addAll(this) }?
Para una copia superficial, sugiero
.map{it}
Eso funcionará para muchos tipos de colecciones.
Maps. Se compila, pero como ites a Map.Entry, y la copia es poco profunda, tiene las mismas entradas.
Como 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 se basa en los constructores de copia de ArrayList y HashMap.
Usaría el toCollection()método de extensión :
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
Esto creará un nuevo MutableListy luego agregará cada elemento del original a la lista recién creada.
El tipo inferido aquí será MutableList<String>. Si no desea exponer la mutabilidad de esta nueva lista, puede declarar el tipo explícitamente como una lista inmutable:
val copy: List<String> = original.toCollection(mutableListOf())
Para listas simples tiene muchas soluciones correctas arriba.
Sin embargo, es solo para listas poco profundas.
La siguiente función funciona para cualquier bidimensional ArrayList. ArrayListes, en la práctica, equivalente a MutableList. Curiosamente, no funciona cuando se usa un MutableListtipo explícito . Si se necesitan más dimensiones, es necesario realizar 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 de enteros:
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
Puedes usar el ArrayListconstructor:ArrayList(list)