【问题标题】:copy 2-dimensional Array复制二维数组
【发布时间】:2013-03-28 12:44:51
【问题描述】:

我想复制一个二维数组。我想用 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
    }

}

【问题讨论】:

  • for 结构的第一个是理解而不是 scala 中的循环。
  • Scala、Java 和 JVM 中只有一维数组。数组的数组不是多维数组。如果你想要它们,你需要从可用的线性 Arrays 创建它们。

标签: arrays scala for-loop


【解决方案1】:

你也可以使用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) 
}

【讨论】:

  • scala> val aa = Array(Array(1, 2, 3), Array(0, 4, 2)) aa: Array[Array[Int]] = Array(Array(1, 2 , 3), Array(0, 4, 2)) scala> aa.clone res0: Array[Array[Int]] = Array(Array(1, 2, 3), Array(0, 4, 2)) res0(0)(0) = 7 scala> res0 res2: Array[Array[Int]] = Array(Array(7, 2, 3), Array(0, 4, 2)) scala> aa res3: Array[Array [整数]] = Array(Array(7, 2, 3), Array(0, 4, 2))
  • 那么使用 .. aa.map(_.clone) :)
  • 或者如果你不想使用clone,那么bild map (_ map identity)
【解决方案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)
    }
  }
}

【讨论】:

    【解决方案3】:

    很简单:

    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)
    

    【讨论】:

      【解决方案4】:

      也可以使用Array.tabulate的方法:

      val source = Array.fill[Int](5, 5)(1)
      val target = Array.tabulate[Int](5, 5)((x, y) => source(x)(y))
      

      【讨论】:

        【解决方案5】:

        对大型数组更有效:

        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))
        

        【讨论】:

        • 是的,与当前接受的版本相比效率更高。
        【解决方案6】:

        复制二维数组最简单的方法是array.clone,但如果您想通过理解自行完成,可以使用以下代码:

        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]]

        【讨论】:

          猜你喜欢
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-18
          • 2014-06-25
          • 2015-06-05
          • 2019-04-13
          • 2016-06-07
          相关资源
          最近更新 更多