Scala:在索引上向 ArrayBuffer 添加元素

Scala: adding element to ArrayBuffer on index

我刚开始学习 Scala,尝试编写一个简单的游戏来学习它的语法和一些基本规则。如果有人能帮我解决一个简单的问题,我将不胜感激。我创建了充满“.”的简单板。现在我想换一个“.”在某个索引上并放在那里 "X"。在 java 中,它看起来像这样:

board[col][row] = symbol;

这是电路板部分:

val board = {
 collection.mutable.ArrayBuffer[String]()
 collection.mutable.ArrayBuffer.fill(cols, rows)(".")
}

def show(): Unit = {
 board.foreach(x => println(x.mkString))
}

def setField(col:Int, row:Int, fieldSymbol:String): Unit = {
 //fieldSymbol on index, which is (col*row) as it's 1d array
 //thought board.apply(col*row): fieldSymbol might work but it's not 
 //correct I guess
}

如有任何帮助,我们将不胜感激。在此先感谢您的建议。

您可以像这样为平面数组实现 setField

def setField(c: Int, r: Int, v: String) {
  board(c * rows + row) = v
}

然而,如果您想将多维数据存储在单个数组中,这只是一个好主意(如果您关心分配结构和类似的东西,这可能会很有趣)。在这种情况下,我建议编写一个通用方法 setField。

如果你想要数组的数组,fill 已经给了你

val board = ArrayBuffer.fill(rows, cols)(".")

然后像这样更新

board(x)(y) = "something"

然而,您应该问问自己是否真的需要可变数据结构,并且您的程序不能使用不可变数据结构来更优雅地表达。而且,如果你真的想要一个二维向量,如果你想将某物表示为一个对象板,特别是如果大部分板是 "empty"。使用地图可能会更优雅:

val board = Map[(Int, Int), String]() // empty board
val nextBoard = bord + ((2,3) -> "something")