Dì che ho un Array[Int]
simile
val array = Array( 1, 2, 3 )
Ora vorrei aggiungere un elemento all'array, ad esempio il valore 4
, come nell'esempio seguente:
val array2 = array + 4 // will not compile
Ovviamente posso usarlo System.arraycopy()
e farlo da solo, ma deve esserci una funzione di libreria Scala per questo, che semplicemente non sono riuscito a trovare. Grazie per eventuali suggerimenti!
Appunti:
Sono consapevole di poter aggiungere un altro Array di elementi, come nella riga seguente, ma sembra troppo rotondo:
val array2b = array ++ Array( 4 ) // this works
Sono consapevole dei vantaggi e degli svantaggi di List vs Array ed eccomi qui per vari motivi specificamente interessato a estendere un Array.
Modifica 1
Grazie per le risposte che puntano al :+
metodo dell'operatore. Questo è quello che stavo cercando. Sfortunatamente, è piuttosto più lento di un'implementazione del metodo append () personalizzato che utilizza arraycopy
- circa due o tre volte più lento. Guardando l'implementazione in SeqLike[]
, viene creato un builder, quindi l'array viene aggiunto ad esso, quindi l'append viene eseguita tramite il builder, quindi viene eseguito il rendering del builder. Non è una buona implementazione per gli array. Ho fatto un rapido benchmark confrontando i due metodi, cercando il tempo più veloce su dieci cicli. L'esecuzione di 10 milioni di ripetizioni di un'appendice di un singolo elemento a un'istanza di matrice a 8 elementi di una classe Foo
richiede 3,1 secondi con :+
e 1,7 secondi con un append()
metodo semplice che utilizzaSystem.arraycopy();
esecuzione di 10 milioni di ripetizioni di accodamento di un singolo elemento su array di 8 elementi di Long richiede 2,1 secondi con :+
e 0,78 secondi con il sempliceappend()
metodo . Mi chiedo se questo non possa essere risolto nella libreria con un'implementazione personalizzata per Array
?
Modifica 2
Per quello che vale, ho presentato un ticket: https://issues.scala-lang.org/browse/SI-5017
System.arraycopy(...)
è sostituito daArray.copy(...)
ArrayBuffer
che viene convertito dopo l' ultima aggiunta a un array (con toArray
)?
ArrayBuffer
e il suo+=
metodo? Questo ti darà O (1) append ammortizzato.