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
    
  • 我知道列表与数组的优缺点,出于各种原因,我对扩展数组特别感兴趣

  • 编辑1 感谢您提供指向
    :+
    运算符方法的答案。这就是我要找的。不幸的是,它比使用
    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