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 :
-
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
-
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é parArray.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 ?
0 votes
Pouvez-vous exécuter à nouveau votre benchmark en utilisant un
ArrayBuffer
qui est converti après le dernier ajouter à un tableau (avectoArray
) ?0 votes
@paradigmatic : Le benchmark n'était bien sûr pas 10 millions d'ajouts au même tableau mais 10 millions de répétitions d'un ajout d'un seul élément à un tableau de 8 éléments. J'ai mis à jour la question en conséquence.
0 votes
Il semble fixé dans github.com/scala/scala/pull/1739 ?