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

时间:2011-09-21 12:53:11

标签: arrays scala append

说我有Array[Int]喜欢

val array = Array( 1, 2, 3 )

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

val array2 = array + 4     // will not compile

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

注意:

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

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

  3. 编辑1

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

    编辑2

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

3 个答案:

答案 0 :(得分:171)

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

0 +: array :+ 4

应该产生:

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

Seq的任何其他实现相同。

答案 1 :(得分:50)

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)

答案 2 :(得分:7)

最简单的可能是:

Array(1, 2, 3) :+ 4

实际上,可以在WrappedArray

中隐式转换数组