arrays - resueltos - Scala: ¿cuál es la mejor manera de agregar un elemento a una matriz?
vectores en java ejemplos (3)
El más fácil podría ser:
Array(1, 2, 3) :+ 4
En realidad, Array puede transformarse de manera WrappedArray
en una WrappedArray
Digamos que tengo una Array[Int]
como
val array = Array( 1, 2, 3 )
Ahora me gustaría añadir un elemento a la matriz, digamos el valor 4
, como en el siguiente ejemplo:
val array2 = array + 4 // will not compile
Por supuesto, System.arraycopy()
usar System.arraycopy()
y hacer esto por mí mismo, pero debe haber una función de biblioteca de Scala para esto, que simplemente no pude encontrar. Gracias por cualquier punteros!
Notas:
Soy consciente de que puedo agregar otra matriz de elementos, como en la siguiente línea, pero parece demasiado redonda:
val array2b = array ++ Array( 4 ) // this works
Soy consciente de las ventajas y desventajas de List vs Array y aquí estoy por varias razones específicamente interesadas en extender una matriz.
Editar 1
Gracias por las respuestas que apuntan al método del operador :+
. Esto es lo que estaba buscando. Desafortunadamente, es bastante más lenta que una implementación de método de arraycopy
personalizada () usando arraycopy
- aproximadamente dos o tres veces más lento. Al SeqLike[]
la implementación en SeqLike[]
, se crea un constructor, luego se agrega la matriz, luego se realiza la adición mediante el constructor y luego se representa el constructor. No es una buena implementación para arreglos. Hice un punto de referencia rápido comparando los dos métodos, mirando el tiempo más rápido de cada diez ciclos. Hacer 10 millones de repeticiones de un solo elemento se agrega a una instancia de matriz de 8 elementos de alguna clase. Foo
toma 3.1 segundos con :+
y 1.7 segundos con un método simple de append()
que usa System.arraycopy();
haciendo 10 millones de repeticiones de anexos de un solo elemento en arreglos de 8 elementos de Largo toma 2.1 segundos con :+
y 0.78 segundos con el método simple de append()
. Me pregunto si esto no se pudo solucionar en la biblioteca con una implementación personalizada para Array
.
Editar 2
Por lo que vale, archivé un boleto: https://issues.scala-lang.org/browse/SI-5017
Puede usar :+
para agregar elemento a la matriz y +:
para anteponerlo:
0 +: array :+ 4
debe producir:
res3: Array[Int] = Array(0, 1, 2, 3, 4)
Es lo mismo que con cualquier otra implementación de Seq
.
val array2 = array :+ 4
//Array(1, 2, 3, 4)
Trabajos también "revertidos":
val array2 = 4 +: array
Array(4, 1, 2, 3)
También hay una versión "en el lugar":
var array = Array( 1, 2, 3 )
array +:= 4
//Array(4, 1, 2, 3)
array :+= 0
//Array(4, 1, 2, 3, 0)