Gregor Scheidt Gregor Scheidt - 1 year ago 133
Scala Question

Scala: what is the best way to append an element to an Array?

Say I have an

Array[Int]
like

val array = Array( 1, 2, 3 )


Now I would like to append an element to the array, say the value
4
, as in the following example:

val array2 = array + 4 // will not compile


I can of course use
System.arraycopy()
and do this on my own, but there must be a Scala library function for this, which I simply could not find. Thanks for any pointers!

Notes:


  1. I am aware that I can append another Array of elements, like in the following line, but that seems too round-about:

    val array2b = array ++ Array( 4 ) // this works

  2. I am aware of the advantages and drawbacks of List vs Array and here I am for various reasons specifically interested in extending an Array.



Edit 1



Thanks for the answers pointing to the
:+
operator method. This is what I was looking for. Unfortunately, it is rather slower than a custom append() method implementation using
arraycopy
-- about two to three times slower. Looking at the implementation in
SeqLike[]
, a builder is created, then the array is added to it, then the append is done via the builder, then the builder is rendered. Not a good implementation for arrays. I did a quick benchmark comparing the two methods, looking at the fastest time out of ten cycles. Doing 10 million repetitions of a single-item append to an 8-element array instance of some class
Foo
takes 3.1 sec with
:+
and 1.7 sec with a simple
append()
method that uses
System.arraycopy();
doing 10 million single-item append repetitions on 8-element arrays of Long takes 2.1 sec with
:+
and 0.78 sec with the simple
append()
method. Wonder if this couldn't be fixed in the library with a custom implementation for
Array
?

Edit 2



For what it's worth, I filed a ticket:
https://issues.scala-lang.org/browse/SI-5017

Answer Source

You can use :+ to append element to array and +: to prepend it:

0 +: array :+ 4

should produce:

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

It's the same as with any other implementation of Seq.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download