Как поменять местами элементы 2D-массива в Scala? - PullRequest
1 голос
/ 06 марта 2012
  1. Почему следующий код не выполняет эту работу?
  2. Как меняется «а» после шага 2?
  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 ]

4 голосов
/ 06 марта 2012

Скопируйте ваш 2D массив таким образом, чтобы создать глубокий клон:

val b = a.map(_.clone)
4 голосов
/ 06 марта 2012

Линия:

val b = a

Не создает "новый" массив b, а просто новую ссылку на массив a. Так что a и b будут указывать на один и тот же массив.

3 голосов
/ 06 марта 2012

Другой подход заключается в расширении класса массива для использования метода подкачки.Вы можете сделать это следующим образом:

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

Таким образом, вы можете использовать его повторно, и это даже выглядит лучше; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...