【问题标题】:Scala: adding element to ArrayBuffer on indexScala:在索引上将元素添加到 ArrayBuffer
【发布时间】:2016-05-12 18:07:21
【问题描述】:

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

任何帮助将不胜感激。提前感谢您的建议。

【问题讨论】:

  • 使用board(i) 访问集合的第i 个值(与Java 的[i] 相同)。
  • 谢谢,没想到这么简单。
  • collection.mutable.ArrayBuffer[String]() 这将创建一个空数组(因为您不对其进行任何操作),然后将其丢弃。您只需要fill
  • 让我再问一些问题,这样我就不会创建很多垃圾话题了。当我有(cols, rows) 时,这意味着我有类似二维数组的东西吗?比如,我可以board(col, row) = fieldSymbol 吗?
  • 你有一个二维数组,但它表示为一个数组数组。它只是 Java(实际上是一个 Scala Array 一个 Java Array)。所以你需要board(col)(row)(我正在工作,所以我不会成为实时的进一步问答服务,如果需要,可以发布“适当”的问题(或查阅 Scala 教程!)

标签: scala arraybuffer


【解决方案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")

【讨论】:

  • tabulatefill 有什么优势?或者fill 在这里行不通?
  • tabulate 返回一个嵌套结构,即在这种情况下 ArrayBuffer[ArrayBuffer[String]] 这也是您在 Java 中通常拥有的结构。
  • 顺便说一句,如果您不需要可变大小的数组,还有 Array.tabulate(...) 会更可取。
  • 是的,我没有。我只是把一切都复杂化了。感谢您的帮助。
  • 在这里使用tabulate 没有任何好处,因为您不会根据xy 的值做任何事情。你应该只使用fill,如下:ArrayBuffer.fill(rows, cols)(".")
猜你喜欢
  • 2013-02-10
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2013-11-05
  • 1970-01-01
  • 2021-08-19
相关资源
最近更新 更多