如何在Scala中有效地将数组复制到另一个?

时间:2015-09-07 05:36:27

标签: arrays scala

如何使用其他方式将Array复制到另一个Array

我的想法是使用=运算符。例如:

val A = Array(...)
val B = A

但这没关系?

第二种方法是使用for loop,例如:

val A = Array(...)
val B = new Array[](A.length)//here suppose the Type is same with A
for(i <- 0 until A.length)
    B(i) = A(i)

4 个答案:

答案 0 :(得分:15)

您可以使用.clone

scala> Array(1,2,3,4)
res0: Array[Int] = Array(1, 2, 3, 4)

scala> res0.clone
res1: Array[Int] = Array(1, 2, 3, 4)

答案 1 :(得分:6)

在此示例中考虑Array.copy dest是可变的Array

val a = (1 to 5).toArray
val dest = new Array[Int](a.size)

等等

dest
Array[Int] = Array(0, 0, 0, 0, 0)

然后

Array.copy(a, 0, dest, 0, a.size)

我们有那个

dest
Array[Int] = Array(1, 2, 3, 4, 5)

来自Scala Array API注意Scala Array.copy等同于Java System.arraycopy,支持多态数组。

答案 2 :(得分:6)

最短且惯用的方法是将mapidentity一起使用,如下所示:

scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)

制作副本

scala> val b = a map(identity)
b: Array[Int] = Array(1, 2, 3, 4, 5)

修改副本

scala> b(0) = 6

他们似乎不同

scala> a == b
res8: Boolean = false

他们是不同的

scala> a
res9: Array[Int] = Array(1, 2, 3, 4, 5)

scala> b
res10: Array[Int] = Array(6, 2, 3, 4, 5)

此副本适用于所有集合类型,而不仅仅是Array

答案 3 :(得分:1)

另一种选择是使用B作为变量参数序列来创建新数组A

val B = Array(A: _*)

要注意的重要一点是,使用等于运算符C = A会导致C指向原始数组A。这意味着更改C将更改A

scala> val A = Array(1, 2, 3, 4)
A: Array[Int] = Array(1, 2, 3, 4)

scala> val B = Array(A: _*)
B: Array[Int] = Array(1, 2, 3, 4)

scala> val C = A
C: Array[Int] = Array(1, 2, 3, 4)

scala> B(0) = 9

scala> A
res1: Array[Int] = Array(1, 2, 3, 4)

scala> B
res2: Array[Int] = Array(9, 2, 3, 4)

scala> C(0) = 8

scala> C
res4: Array[Int] = Array(8, 2, 3, 4)

scala> A
res5: Array[Int] = Array(8, 2, 3, 4)