Scala:将元素追加到数组的最佳方法是什么?

Gre*_*idt 107 arrays scala append

说我Array[Int]喜欢

val array = Array( 1, 2, 3 )
Run Code Online (Sandbox Code Playgroud)

现在我想在数组中添加一个元素,比如值4,如下例所示:

val array2 = array + 4     // will not compile
Run Code Online (Sandbox Code Playgroud)

我当然可以System.arraycopy()自己使用并执行此操作,但必须有一个Scala库函数,我根本找不到.感谢您的任何指示!

笔记:

  1. 我知道我可以附加另一个元素数组,如下面一行,但这似乎太圆了:

    val array2b = array ++ Array( 4 )     // this works
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我知道List vs Array的优点和缺点,在这里我出于各种原因特别感兴趣扩展Array.

编辑1

感谢指向:+操作员方法的答案.这就是我想要的.不幸的是,它比使用自定义append()方法实现慢得多arraycopy- 大约慢两到三倍.查看实现SeqLike[],创建构建器,然后将数组添加到其中,然后通过构建器完成追加,然后呈现构建器.对阵列来说不是一个好的实现.我做了一个比较两种方法的快速基准测试,查看十个周期中最快的时间.将一个项目的1000万次重复附加到某个类的8个元素数组实例Foo需要3.1秒:+和1.7秒,使用一个简单的append()方法,使用System.arraycopy();在8个元素的Long元素上执行1000万个单项追加重复2.1用:+简单的append()方法得秒和0.78秒.想知道这是否无法在具有自定义实现的库中修复Array

编辑2

为了它的价值,我提交了一张票:https: //issues.scala-lang.org/browse/SI-5017

ten*_*shi 182

您可以使用:+将元素追加到数组并+:在其前面添加:

0 +: array :+ 4
Run Code Online (Sandbox Code Playgroud)

应该产生:

res3: Array[Int] = Array(0, 1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

它与任何其他实现相同Seq.

  • 对于任何其他scala*ordered*集合都是相同的,它不能与set一起使用(因为prepend和append对于Set没有任何意义). (3认同)

Lan*_*dei 52

val array2 = array :+ 4
//Array(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

作品也"逆转":

val array2 = 4 +: array
Array(4, 1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

还有一个"就地"版本:

var array = Array( 1, 2, 3 )
array +:= 4
//Array(4, 1, 2, 3)
array :+= 0
//Array(4, 1, 2, 3, 0)
Run Code Online (Sandbox Code Playgroud)

  • 我只是想知道为什么Array集合不使用append()方法,就像ArrayBuffer一样.在我看来,与使用新的运算符相比,更多的是协调和统一:+/+: (11认同)

Nic*_*las 7

最简单的可能是:

Array(1, 2, 3) :+ 4
Run Code Online (Sandbox Code Playgroud)

实际上,Array可以在一个实际上被转换 WrappedArray