4

2次元配列をコピーしたい。これを for ループで実行したいのですが、その方法を考えていますが、残りは完了できません。

def copy(bild:Array[Array[Int]]):Unit = {

    for(x <- 0 until bild.length)
    for(y <- 0 until bild(x).length) {
        bild(x)(y) = 
        //i don't know how to create the new array
    }

}
4

6 に答える 6

7

メソッドも使えますclone!!

def copy(bild: Array[Array[Int]]): Unit = {
    val copy = bild.clone
} 

アップデート :

Array[Int] は依然として変更可能な参照であるため、クローンを作成しても問題は解決しません.. Andriy Plokhotnyuk のコメントで言及されているように..

問題 :

val og = Array(Array(1, 2, 3), Array(4,5,6))      //> og  : Array[Array[Int]] = Array(Array(1, 2, 3), Array(4, 5, 6))
val copy = og.clone                               //> copy  : Array[Array[Int]] = Array(Array(1, 2, 3), Array(4, 5, 6))
copy(0)(0) = 7
og                                                //> res2: Array[Array[Int]] = Array(Array(7, 2, 3), Array(4, 5, 6))
copy                                              //> res3: Array[Array[Int]] = Array(Array(7, 2, 3), Array(4, 5, 6))

ここでの更新は、 ..にもcopy反映されます。og

ソル:

したがって、主に Array[Int] も複製する必要があります..したがって..

val og = Array(Array(1, 2, 3), Array(4,5,6))      //> og  : Array[Array[Int]] = Array(Array(1, 2, 3), Array(4, 5, 6))
val copy = og.map(_.clone)                        //> copy  : Array[Array[Int]] = Array(Array(1, 2, 3), Array(4, 5, 6))
copy(0)(0) = 7
og                                                //> res2: Array[Array[Int]] = Array(Array(1, 2, 3), Array(4, 5, 6))
copy                                              //> res3: Array[Array[Int]] = Array(Array(7, 2, 3), Array(4, 5, 6))

したがって..質問のコピー方法をリファクタリングして..

def copy(bild: Array[Array[Int]]): Unit = {
    val copy = bild.map(_.clone) 
}
于 2013-03-28T13:03:31.260 に答える
2
def copy(bild: Array[Array[Int]]):Unit = {
  val result = Array.ofDim[Array[Int]](bild.length)
  for(x <- 0 until bild.length) {
    result(x) = Array.ofDim[Int](bild(x).length)
    for(y <- 0 until bild(x).length) {
      result(x)(y) = bild(x)(y)
    }
  }
}
于 2013-03-28T13:04:37.007 に答える
1

非常に簡単です:

scala> Array.ofDim[Int](3)
//res0: Array[Int] = Array(0, 0, 0)
scala> Array.ofDim[String](4)
//res1: Array[String] = Array(null, null, null, null)
于 2013-03-28T12:48:43.567 に答える
0

2 次元配列をコピーする最も簡単な方法は ですがarray.clone、for 内包表記を使用して自分でコピーしたい場合は、次のコードを使用できます。

def copy[A](arr: Array[Array[A]]) = for (x <- 0 until arr.length) yield for (y <- 0 until arr(x).length) yield arr(x)(y)

これにより、 が得られますVector[Vector[A]]

于 2013-03-28T13:27:04.247 に答える
0

大きな配列ではより効率的です:

scala> :paste
// Entering paste mode (ctrl-D to finish)

def copyOf(as: Array[Array[Int]]): Array[Array[Int]] = {
  val cas = Array.ofDim[Array[Int]](as.length)
  for(i <- 0 until as.length) {
    val a = as(i)
    cas(i) = java.util.Arrays.copyOf(a, a.length)
  }
  cas
}

// Exiting paste mode, now interpreting.

copyOf: (as: Array[Array[Int]])Array[Array[Int]]

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

scala> copyOf(res0)
res1: Array[Array[Int]] = Array(Array(0, 1), Array(2, 3))

scala> res0(0)(0) = 7

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

scala> res1
res4: Array[Array[Int]] = Array(Array(0, 1), Array(2, 3))
于 2013-03-28T14:25:20.713 に答える