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

时间:2016-02-03 13:46:48

标签: scala arraybuffer

我刚开始学习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
}

非常感谢任何帮助。提前感谢您的建议。

1 个答案:

答案 0 :(得分:1)

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

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

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

如果您想要数组数组,则填充已经为您提供了

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

然后就像这样更新

board(x)(y) = "something"

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

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