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.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 - 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 Iterable
es un List
(como toString
y 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 this
es 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 addAll
es la forma más rápida de copiar porque usa el nativo System.arraycopy
en la implementación de ArrayList
.
Además, tenga en cuenta que esto solo le dará una copia superficial .
addAll(this@copyOf)
, porque this
dentro apply
se 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.
Map
s. Se compila, pero como it
es 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 MutableList
y 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
. ArrayList
es, en la práctica, equivalente a MutableList
. Curiosamente, no funciona cuando se usa un MutableList
tipo 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 ArrayList
constructor:ArrayList(list)