Scala:将元素附加到数组的最佳方法是啥?
Posted
技术标签:
【中文标题】Scala:将元素附加到数组的最佳方法是啥?【英文标题】:Scala: what is the best way to append an element to an Array?Scala:将元素附加到数组的最佳方法是什么? 【发布时间】: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 元素数组。我相应地更新了问题。
【参考方案1】:
您可以使用:+
将元素附加到数组并使用+:
将其添加到前面:
0 +: array :+ 4
应该产生:
res3: Array[Int] = Array(0, 1, 2, 3, 4)
这与Seq
的任何其他实现相同。
【讨论】:
对于任何其他 scala ordered 集合都是一样的,例如它不适用于 set(因为 prepend 和 append 对 Set 没有任何意义)。 @Nicolas 任何序列。 有序意味着排序。 @Daniel 是的,我写评论的时候只是有一个小的记忆漏洞,我没有找到明显的“序列”这个词 @tenshi 所有这些运算符都会创建一个新数组吗?是的,确实如此(来自:+ 代码)Array.copy(repr, 0, result, 0, repr.length)
【参考方案2】:
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 集合不使用 append() 方法,就像 ArrayBuffer 一样。在我看来,它比使用新运算符更协调和统一:+/+:【参考方案3】:最简单的可能是:
Array(1, 2, 3) :+ 4
实际上,Array 可以隐式转换为 WrappedArray
【讨论】:
在这种情况下,那将是更高优先级的转换为 ArrayOps以上是关于Scala:将元素附加到数组的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章