web-dev-qa-db-fra.com

Scala: quel est le meilleur moyen d'ajouter un élément à un tableau?

Disons que j'ai un Array[Int] Comme

val array = Array( 1, 2, 3 )

Maintenant, j'aimerais ajouter un élément au tableau, dites la valeur 4, Comme dans l'exemple suivant:

val array2 = array + 4     // will not compile

Je peux bien sûr utiliser System.arraycopy() et le faire moi-même, mais il doit y avoir une fonction de bibliothèque Scala, que je ne pouvais tout simplement pas trouver. Merci pour tous les pointeurs !

Remarques:

  1. Je suis conscient que je peux ajouter un autre tableau d'éléments, comme dans la ligne suivante, mais cela semble trop arrondi:

    val array2b = array ++ Array( 4 )     // this works
    
  2. Je suis conscient des avantages et des inconvénients de List vs Array et je suis ici, pour diverses raisons, spécifiquement intéressé par l'extension d'un tableau.

Modifier 1

Merci pour les réponses pointant vers la méthode de l’opérateur :+. C'est ce que je cherchais. Malheureusement, il est plutôt plus lent qu'une implémentation de méthode append () personnalisée utilisant arraycopy, environ deux à trois fois plus lentement. En regardant l'implémentation dans SeqLike[], Un générateur est créé, puis le tableau y est ajouté, l'ajout est effectué via le générateur, puis le générateur est rendu. Pas une bonne implémentation pour les tableaux. J'ai fait un repère rapide en comparant les deux méthodes, en examinant le temps le plus rapide sur dix cycles. Faire 10 millions de répétitions d'un seul élément, ajouter à une instance de tableau à 8 éléments d'une classe Foo prend 3,1 s avec :+ Et 1,7 s avec une simple méthode append() qui utilise System.arraycopy(); pour effectuer 10 millions de répétitions d’ajout d’élément unique sur des tableaux à 8 éléments de Long prend 2,1 s avec :+ et 0,78 s avec la méthode simple append(). Je me demande si cela ne pourrait pas être corrigé dans la bibliothèque avec une implémentation personnalisée pour Array?

Modifier 2

Pour ce que ça vaut, j'ai déposé un ticket: https://issues.scala-lang.org/browse/SI-5017

103
Gregor Scheidt

Vous pouvez utiliser :+ pour ajouter un élément à array et +: pour l'ajouter:

0 +: array :+ 4

devrait produire:

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

C'est la même chose que pour toute autre implémentation de Seq.

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

Fonctionne aussi "inversé":

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

Il existe également une version "sur place":

var array = Array( 1, 2, 3 )
array +:= 4
//Array(4, 1, 2, 3)
array :+= 0
//Array(4, 1, 2, 3, 0)
51
Landei

Le plus simple pourrait être:

Array(1, 2, 3) :+ 4

En fait, Array peut être implicitement transformé en un WrappedArray

7
Nicolas