Arrays Scala:将元素附加到数组的最佳方式是什么?
假设我有一个Arrays Scala:将元素附加到数组的最佳方式是什么?,arrays,scala,append,Arrays,Scala,Append,假设我有一个数组[Int]像 val array = Array( 1, 2, 3 ) 现在我想在数组中附加一个元素,比如说值4,如下例所示: val array2 = array + 4 // will not compile 当然,我可以使用System.arraycopy()并自己完成这项工作,但必须有一个Scala库函数来完成这项工作,我就是找不到这个函数。谢谢你的指点 注: 我知道我可以附加另一个元素数组,如下一行所示,但这似乎太圆了: val array2b = arra
数组[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
:+
运算符方法的答案。这就是我要找的。不幸的是,它比使用arraycopy
的自定义append()方法实现慢得多——大约慢两到三倍。查看SeqLike[]
中的实现,创建一个构建器,然后将数组添加到其中,然后通过构建器进行追加,然后呈现构建器。对于阵列来说,这不是一个好的实现。我做了一个快速的基准测试,比较了这两种方法,查看了十个周期中最快的时间。对某个类的8元素数组实例执行1000万次重复的单个项追加操作Foo
使用:+
需要3.1秒,使用System.arraycopy()的简单追加()方法需要1.7秒代码>使用:+
在8个元素的长数组上重复执行1000万项附加操作需要2.1秒,使用简单的append()
方法需要0.78秒。想知道在库中是否无法使用数组的自定义实现修复此问题
编辑2
不管它值多少钱,我开了一张罚单:
您可以使用:+
将元素追加到数组中,并使用+:
将其前置:
0 +: array :+ 4
应产生:
res3: Array[Int] = Array(0, 1, 2, 3, 4)
这与Seq
的任何其他实现相同
val array2 = array :+ 4
//Array(1, 2, 3, 4)
作品也“颠倒”:
还有一个“就地”版本:
最简单的可能是:
Array(1, 2, 3) :+ 4
实际上,数组可以在一个中简单地转换,为什么不使用它的+=
方法呢?在scala中,System.arraycopy(…)
被Array.copy(…)
替换为Array.copy(…)
您知道列表与数组的优缺点,但是你对1000万个附件的基准测试结果感到惊讶吗?你能使用ArrayBuffer
再次运行你的基准测试吗?它是在最后一次附加到数组之后转换的(使用toArray
)?@paradigmatic:当然,基准不是向同一个数组添加1000万个附加项,而是向8元素数组添加1000万个重复项。我相应地更新了这个问题。这对于任何其他scala有序集合都是一样的,例如,它不适用于set(因为prepend和append对set没有任何意义)。@Nicolas any sequence。排序意味着排序。@Daniel是的,我写评论时内存有一个小洞,没有找到明显的单词“sequence”@tenshi所有这些操作符会创建一个新数组吗?是的,它会(from:+code)Array.copy(repr,0,result,0,repr.length)
在这种情况下,这将是到ArrayOpsI的更高优先级的转换,只是想知道为什么数组集合不使用append()方法,就像ArrayBuffer一样。在我看来,它比使用一个新操作符更协调和统一:+/+:
var array = Array( 1, 2, 3 )
array +:= 4
//Array(4, 1, 2, 3)
array :+= 0
//Array(4, 1, 2, 3, 0)
Array(1, 2, 3) :+ 4