Scala: ¿cuál es la mejor manera de añadir un elemento a una Matriz?

Decir que tengo un Array[Int] como

val array = Array( 1, 2, 3 )

Ahora me gustaría añadir un elemento a la matriz, dicen que el valor 4, como en el siguiente ejemplo:

val array2 = array + 4     //will not compile

Puedo, por supuesto, utilizar System.arraycopy() y hacer esto por mi cuenta, pero no debe ser un Scala función de biblioteca para esto, que yo simplemente no podía encontrar. Gracias por los punteros!

Notas:

  1. Soy consciente de que puedo agregar otro conjunto de elementos, como en la siguiente línea, pero que parece demasiado redonda sobre:

    val array2b = array ++ Array( 4 )     //this works
  2. Soy consciente de las ventajas y desventajas de la Lista de vs Matriz y aquí estoy, por diversas razones, especialmente interesado en la ampliación de una Matriz.

Editar 1

Gracias por las respuestas apuntan a la :+ método de operador. Esto es lo que yo estaba buscando. Por desgracia, es bastante más lento que un método append() utilizando la implementación arraycopy — alrededor de dos a tres veces más lento. Mirar la implementación en SeqLike[], un constructor es creado, entonces la matriz que se le añade, a continuación, el append se realiza a través del generador, entonces el generador se representa. No es una buena aplicación para las matrices. Hice una rápida referencia comparar los dos métodos, mirando el mejor tiempo de los diez ciclos. Haciendo 10 millones de repeticiones de un solo elemento anexar a 8 elementos de la matriz de instancia de la clase Foo toma 3.1 seg con :+ y 1,7 segundos con un simple append() método que utiliza System.arraycopy(); haciendo 10 millones único elemento anexar repeticiones de 8 elementos de las matrices de tomas Largas 2.1 seg con :+ y 0,78 sec con el simple append() método. Me pregunto si esto no podía ser fijo en la biblioteca con una implementación personalizada para Array?

Editar 2

Para lo que vale, la que presentó un ticket:
https://issues.scala-lang.org/browse/SI-5017

  • ¿Por qué no usar ArrayBuffer y su += método? Que le dará amortizado O(1) anexar.
  • En scala, System.arraycopy(...) es reemplazado por Array.copy(...)
  • Usted es consciente de las ventajas y desventajas de la Lista de vs de la Matriz, pero se sorprenden de los resultados de la evaluación de 10 millones anexa?
  • Se puede ejecutar de nuevo su punto de referencia utilizando un ArrayBuffer que se convierte después de la última anexar a una matriz (con toArray) ?
  • El punto de referencia de curso no fue de 10 millones anexa a la misma matriz, pero a los 10 millones de repeticiones de un solo elemento anexar a 8 elementos de la matriz. He actualizado la pregunta en consecuencia.
  • Parece fijo en github.com/scala/scala/pull/1739?

3 Kommentare

  1. 183

    Puede utilizar :+ para añadir el elemento a la matriz y +: anteponer a ella:

    0 +: array :+ 4

    debe producir:

    res3: Array[Int] = Array(0, 1, 2, 3, 4)

    Es el mismo que con cualquier otra aplicación de Seq.

    • Es el mismo que para cualquier otro scala ordenó colección, no funciona con por ejemplo (como anteponer y anexar no significa nada para un Conjunto).
    • Cualquier secuencia. Ordenó implica clasificados.
    • Sí, acabo de tener un pequeño agujero de memoria cuando escribí el comentario y no me pareció de lo obvio de la palabra «secuencia»
    • todos estos operadores de crear una nueva matriz? Sí, sí (de :+ código) Array.copy(repr, 0, result, 0, repr.length)
  2. 52
    val array2 = array :+ 4
    //Array(1, 2, 3, 4)

    También funciona «al revés»:

    val array2 = 4 +: array
    Array(4, 1, 2, 3)

    También hay un «en lugar de» versión:

    var array = Array( 1, 2, 3 )
    array +:= 4
    //Array(4, 1, 2, 3)
    array :+= 0
    //Array(4, 1, 2, 3, 0)
    • Me pregunto por qué la Matriz de recolección no utilizar el método append (), así como el ArrayBuffer. En mi opinión,es más la Coordinación y la unificación de que el uso de un nuevo operador :+/+:
  3. 7

    La más sencilla podría ser:

    Array(1, 2, 3) :+ 4

    De hecho, la Matriz puede ser implcitly transformado en un WrappedArray

    • En ese caso, que sería el de mayor prioridad a la conversión a ArrayOps

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea