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 再次运行您的基准测试,该ArrayBufferlast 附加到数组后转换(使用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:将元素附加到数组的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将 Vue 对象附加到元素的最推荐语法是啥?

将向量附加到向量的最佳方法[重复]

为啥交叉构建约定将 scala 版本附加到 artifactId?

将元素附加到数组后,它应该显示更多元素

将列表元素附加到python中的列表列表

使用 postgres 9.4 将 JSON 元素附加到数组