如何在Scala中交换2D数组的元素?

时间:2012-03-06 14:00:02

标签: scala

  1. 为什么以下代码不能完成这项工作?
  2. 第2步后如何更改“a”?
  3. 完成任务的最佳解决方案是什么?

    // 1. Create a 2D array 'a'
    val a = Array.ofDim[String](2, 2)
    a(0)(0) = "TL"
    a(0)(1) = "TR"
    a(1)(0) = "BL"
    a(1)(1) = "BR"
    
    // 2. Swap two elements of 'a' to create a new 2D array 'b'
    val b = a
    b(0)(0) = a(0)(1)
    b(0)(1) = a(0)(0)
    
    // Output
    println("a:")
    println(a(0)(0) + " " + a(0)(1))
    println(a(1)(0) + " " + a(1)(1))
    println("b:")
    println(b(0)(0) + " " + b(0)(1))
    println(b(1)(0) + " " + b(1)(1))
    
    Result:
    a:
    TR **TR**
    BL BR
    b:
    TR **TR**
    BL BR
    

3 个答案:

答案 0 :(得分:4)

该行:

val b = a

不创建“新”数组b,而只创建对数组a的新引用。因此ab将指向同一个数组。

答案 1 :(得分:4)

像这样复制2D数组以创建深度克隆:

val b = a.map(_.clone)

答案 2 :(得分:3)

另一种方法是将数组类扩展为具有交换方法。你可以这样做:

object SwapArray {
  class SwapArrayOp[A](array: Array[A]) {
    def swap(x: Int, y: Int) = {
      val a = array(x)
      array(x) = array(y)
      array(y) = a
    }
  }
  implicit def array2Swap[A](array: Array[A]) = new SwapArrayOp(array)
}

现在您可以交换这样的值:

import SwapArray._

val array = Array(Array(1,2), Array(3,4))
array(0).swap(0,1)
println(array) // => Array(Array(2, 1), Array(3, 4))

这样你可以重复使用它甚至看起来更好; - )