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 worksSono 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 Foorichiede 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(...)
ArrayBufferche viene convertito dopo l' ultima aggiunta a un array (con toArray)?
ArrayBuffere il suo+=metodo? Questo ti darà O (1) append ammortizzato.