it-swarm.cn

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

假设我有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。

编辑1

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

编辑2

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

100
Gregor Scheidt

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

0 +: array :+ 4

应该产生:

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

它与Seq的任何其他实现相同。

169
tenshi
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)
50
Landei

最简单的可能是:

Array(1, 2, 3) :+ 4

实际上,Array可以在 WrappedArray中进行有意义的转换

7
Nicolas