113 votes

Scala : quelle est la meilleure façon d'ajouter un élément à un tableau ?

Disons que j'ai un Array[Int] comme

val array = Array( 1, 2, 3 )

Maintenant je voudrais ajouter un élément au tableau, disons la valeur 4 comme dans l'exemple suivant :

val array2 = array + 4     // will not compile

Je peux bien sûr utiliser System.arraycopy() et faire cela moi-même, mais il doit exister une fonction de la bibliothèque Scala pour cela, que je n'ai tout simplement pas trouvée. Merci de votre aide !

Notes :

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

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

Edit 1

Merci pour les réponses indiquant le :+ méthode de l'opérateur. C'est ce que je recherchais. Malheureusement, elle est plus lente que l'implémentation d'une méthode append() personnalisée utilisant la méthode arraycopy -- environ deux à trois fois plus lent. En regardant l'implémentation dans SeqLike[] un constructeur est créé, puis le tableau est ajouté à celui-ci, puis l'ajout est effectué via le constructeur, puis le constructeur est rendu. Ce n'est pas une bonne implémentation pour les tableaux. J'ai fait un rapide benchmark comparant les deux méthodes, en regardant le temps le plus rapide sur dix cycles. Faire 10 millions de répétitions d'un append d'un seul élément à un tableau de 8 éléments d'une classe quelconque. Foo prend 3,1 secondes avec :+ et 1,7 sec avec un simple append() qui utilise System.arraycopy(); pour effectuer 10 millions de répétitions d'appendices d'un seul élément sur des tableaux de 8 éléments de Long, il faut 2,1 s avec :+ et 0,78 sec avec le simple append() méthode. Je me demande si cela ne pourrait pas être corrigé dans la bibliothèque avec une implémentation personnalisée de la méthode Array ?

Edit 2

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

11 votes

Pourquoi ne pas utiliser ArrayBuffer et son += ? Cela vous donnera un appendice O(1) amorti.

1 votes

En scala, System.arraycopy(...) est remplacé par Array.copy(...)

1 votes

Vous connaissez les avantages et les inconvénients de List vs Array, mais vous êtes surpris par les résultats d'un benchmark de 10 millions d'ajouts ?

214voto

tenshi Points 13370

Vous pouvez utiliser :+ pour ajouter un élément au tableau et +: pour le faire précéder :

0 +: array :+ 4

devrait produire :

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

C'est la même chose qu'avec n'importe quelle autre implémentation de Seq .

3 votes

C'est la même chose pour tout autre scala commandé collection, cela ne fonctionne pas avec set par exemple (car prepend et append ne signifie rien pour un Set).

0 votes

@Nicolas Toute séquence. Commandé implique trié .

0 votes

@Daniel Oui, j'ai juste un petit trou de mémoire quand j'ai écrit le commentaire et je n'ai pas trouvé le mot évident "séquence".

61voto

Landei Points 30509
val array2 = array :+ 4
//Array(1, 2, 3, 4)

Travaux également "inversés" :

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)

11 votes

Je me demande pourquoi la collection Array n'utilise pas la méthode append(), tout comme le ArrayBuffer. A mon avis, c'est plus coordonné et unifié que d'utiliser un nouvel opérateur :+/+ :

8voto

Nicolas Points 11558

Le plus simple pourrait être :

Array(1, 2, 3) :+ 4

En fait, Array peut être transformé de manière implacable en un système de gestion de l'information. WrappedArray

0 votes

Dans ce cas, ce serait la conversion la plus prioritaire pour ArrayOps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X