【发布时间】:2011-11-21 22:33:41
【问题描述】:
假设我有一个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[] 中的实现,创建了一个构建器,然后将数组添加到其中,然后通过构建器完成附加,然后渲染构建器。对于数组来说不是一个好的实现。我做了一个比较这两种方法的快速基准测试,查看十个周期中最快的时间。对某个类 Foo 的 8 元素数组实例执行 1000 万次重复附加到某个类 :+ 的 8 元素数组实例需要 3.1 秒,而使用使用 System.arraycopy(); 的简单 append() 方法执行 1000 万次单项需要 1.7 秒使用 :+ 对 Long 的 8 元素数组添加重复项需要 2.1 秒,使用简单的 append() 方法需要 0.78 秒。想知道这是否不能在库中通过Array 的自定义实现来解决?
编辑 2
为了它的价值,我提交了一张票: https://issues.scala-lang.org/browse/SI-5017
【问题讨论】:
-
为什么不使用
ArrayBuffer及其+=方法?这会给你摊销 O(1) 追加。 -
在scala中,
System.arraycopy(...)被Array.copy(...)替换 -
您知道 List 与 Array 的优缺点,但对 1000 万追加的基准测试结果感到惊讶?
-
您能否使用
ArrayBuffer再次运行您的基准测试,该ArrayBuffer在last 附加到数组后转换(使用toArray)? -
@paradigmatic:基准当然不是 1000 万次追加到同一个数组,而是 1000 万次重复单个项目追加到 8 元素数组。我相应地更新了问题。