Scala:将元素追加到数组的最佳方式是什么?
说我有一个Array[Int]
像
val array = Array( 1, 2, 3 )
现在我想追加一个元素到数组中,比如4
,如下例所示:
val array2 = array + 4 // will not compile
我当然可以使用System.arraycopy()
,并自己做这个,但是必须有一个Scala库函数,这是我根本找不到的。 感谢任何指针!
笔记:
-
我知道我可以追加另一个元素数组,如下面的代码,但是看起来太圆了:
val array2b = array ++ Array( 4 ) // this works
-
我知道列表与数组的优点和缺点,在这里我出于各种各样的原因,特别感兴趣的扩展数组。
编辑1
感谢指向:+
运算符方法的答案。 这是我正在寻找的。 不幸的是,它比使用arraycopy
的自定义append()方法实现要慢 – 约慢两到三倍。 看SeqLike[]
中的实现,创build一个构build器,然后将数组添加到其中,然后通过构build器完成追加,然后构build器被呈现。 不是一个好的数组实现。 我做了一个比较两种方法的快速基准,看十个周期中最快的时间。 做一千万重复的单项附加到某个类Foo
一个8元素数组实例需要3.1秒, :+
和1.7秒与一个简单的append()
方法,使用System.arraycopy();
Long的8元素数组中执行1000万个单项追加重复操作需要2.1秒, :+
和0.78秒的简单append()
方法。 不知道如果这不能在Array
库中定制的Array
自定义实现?
编辑2
值得一提的是,我提交了一张票: https : //issues.scala-lang.org/browse/SI-5017
您可以使用:+
将元素追加到数组, +:
作为前缀:
0 +: array :+ 4
应该产生:
res3: Array[Int] = Array(0, 1, 2, 3, 4)
这和其他Scala系列一样。
val array2 = array :+ 4 //Array(1, 2, 3, 4)
作品也“倒转”:
val array2 = 4 +: array Array(4, 1, 2, 3)
还有一个“就地”版本:
var array = Array( 1, 2, 3 ) array +:= 4 //Array(4, 1, 2, 3) array :+= 0 //Array(4, 1, 2, 3, 0)
最简单的可能是:
Array(1, 2, 3) :+ 4
实际上,Array可以在一个WrappedArray
被隐式转换