Di que tengo un me Array[Int]
gusta
val array = Array( 1, 2, 3 )
Ahora me gustaría agregar un elemento a la matriz, decir el valor 4
, como en el siguiente ejemplo:
val array2 = array + 4 // will not compile
Por supuesto, puedo usar System.arraycopy()
y hacer esto por mi cuenta, pero debe haber una función de biblioteca Scala para esto, que simplemente no pude encontrar. ¡Gracias por los consejos!
Notas:
Soy consciente de que puedo agregar otra matriz de elementos, como en la siguiente línea, pero eso parece demasiado indirecto:
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 interesado en extender un Array.
Editar 1
Gracias por las respuestas que apuntan al :+
método del operador. Esto es lo que estaba buscando. Desafortunadamente, es bastante más lento que la implementación del método append () personalizado arraycopy
, aproximadamente dos o tres veces más lento. Al observar la implementación en SeqLike[]
, se crea un constructor, luego se le agrega la matriz, luego se realiza la adición a través del constructor y luego se renderiza el constructor. No es una buena implementación para matrices. Hice un punto de referencia rápido comparando los dos métodos, mirando el tiempo más rápido de diez ciclos. Hacer 10 millones de repeticiones de un anexo de un solo elemento a una instancia de matriz de 8 elementos de alguna clase Foo
toma 3.1 segundos :+
y 1.7 segundos con un append()
método simple que usaSystem.arraycopy();
hacer 10 millones de repeticiones de adición de un solo elemento en matrices de 8 elementos de Long toma 2,1 segundos :+
y 0,78 segundos con el append()
método simple . Me pregunto si esto no se podría arreglar en la biblioteca con una implementación personalizada para Array
.
Editar 2
Por lo que vale, presenté un ticket: https://issues.scala-lang.org/browse/SI-5017
ArrayBuffer
y su+=
método? Eso le dará un anexo O (1) amortizado.System.arraycopy(...)
se reemplaza porArray.copy(...)
ArrayBuffer
que se convierte después del último agregado a una matriz (contoArray
)?Respuestas:
Puede usar
:+
para agregar un elemento a la matriz y+:
anteponerlo:debe producir:
Es lo mismo que con cualquier otra implementación de
Seq
.fuente
Array.copy(repr, 0, result, 0, repr.length)
Funciona también "invertida":
También hay una versión "in situ":
fuente
El más fácil podría ser:
En realidad, Array se puede transformar implícitamente en un
WrappedArray
fuente