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

Bra*_*anY 6 arrays scala

我如何使用另一种方式将a复制Array到另一个Array

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

val A = Array(...)
val B = A
Run Code Online (Sandbox Code Playgroud)

但这没关系?

第二种方法是使用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)
Run Code Online (Sandbox Code Playgroud)

小智 16

您可以使用 .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)
Run Code Online (Sandbox Code Playgroud)


elm*_*elm 6

Array.copy在这个例子中考虑哪里dest是可变的Array,

val a = (1 to 5).toArray
val dest = new Array[Int](a.size)
Run Code Online (Sandbox Code Playgroud)

所以

dest
Array[Int] = Array(0, 0, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

然后为

Array.copy(a, 0, dest, 0, a.size)
Run Code Online (Sandbox Code Playgroud)

我们有

dest
Array[Int] = Array(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

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


tux*_*dna 6

最短和习惯的方法是使用map具有identity这样的:

scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

复制一份

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

修改副本

scala> b(0) = 6
Run Code Online (Sandbox Code Playgroud)

他们似乎不同

scala> a == b
res8: Boolean = false
Run Code Online (Sandbox Code Playgroud)

他们是不同的

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

scala> b
res10: Array[Int] = Array(6, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

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

  • 非常感谢!经过一小时的搜索,这就是我想要的! (2认同)
  • 尽管 b 是 val ,这阻止我们将它重新分配给其他值,但 Array 是可变的。 (2认同)