Dis 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 par moi-même, mais il doit y avoir une fonction de bibliothèque Scala pour cela, que je n'ai tout simplement pas pu trouver. Merci pour tous les conseils!
Remarques:
Je suis conscient que je peux ajouter un autre tableau d'éléments, comme dans la ligne suivante, mais cela semble trop rond:
val array2b = array ++ Array( 4 ) // this works
Je suis conscient des avantages et des inconvénients de List vs Array et me voici pour diverses raisons spécifiquement intéressé par l'extension d'un Array.
Modifier 1
Merci pour les réponses pointant vers la :+
méthode 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 en utilisant arraycopy
- environ deux à trois fois plus lent. En regardant l'implémentation dans SeqLike[]
, un générateur est créé, puis le tableau y est ajouté, puis l'ajout se fait via le générateur, puis le générateur est rendu. Pas une bonne implémentation pour les tableaux. J'ai fait une comparaison rapide des deux méthodes, en regardant le temps le plus rapide sur dix cycles. Faire 10 millions de répétitions d'un seul élément ajouté à une instance de tableau à 8 éléments d'une classe Foo
prend 3,1 s avec :+
et 1,7 s avec une append()
méthode simple qui utiliseSystem.arraycopy();
faire 10 millions de répétitions d'ajout d'un seul élément sur des tableaux de 8 éléments de Long prend 2,1 s avec :+
et 0,78 s avec la append()
méthode simple . Je me demande si cela ne peut 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
ArrayBuffer
et sa+=
méthode? Cela vous donnera un ajout O (1) amorti.System.arraycopy(...)
est remplacé parArray.copy(...)
ArrayBuffer
qui est converti après le dernier ajout à un tableau (avectoArray
)?Réponses:
Vous pouvez utiliser
:+
pour ajouter un élément au tableau et+:
le préfixer:devrait produire:
C'est la même chose que pour toute autre implémentation de
Seq
.la source
Array.copy(repr, 0, result, 0, repr.length)
Fonctionne également "inversé":
Il existe également une version "sur place":
la source
Le plus simple pourrait être:
En fait, Array peut être implicitement transformé en un
WrappedArray
la source