在Scala中创建并填充2D数组

时间:2015-07-12 00:17:22

标签: java arrays scala multidimensional-array intellij-idea

我刚刚开始研究Scala,我决定做一个roguelike让我的脚湿透。我来自Java背景,我在使用Scala Arrays时遇到了麻烦。

当我尝试制作一个关卡时,我称之为房间,我用#作为墙壁拍摄二维数组。根据我的理解,我尝试使用Scala嵌套for循环来放置{| 1}}墙角色时i || j为0,或者当i ||时j位于数组的末尾。在for循环的大括号内,我有#,它在我的IDE,IntelliJ中给出了错误temp(i, j) = '#'

我已在下面发布了我的代码,如果你能帮我格式化和/或正确使用我的数组,那就太棒了。

"Expression of type Char doesn't conform to expected type, Nothing"

2 个答案:

答案 0 :(得分:6)

var temp = Array[Char](10, 10)创建一个包含两个换行符的1维Array(10表示其在ascii中的值)。

您需要使用var temp = Array.ofDim[Char](10,10)代替。然后,您可以使用temp(i)(j)(而不是temp(i, j))访问单元格。

另请注意,for (i <- 0 to 10) {}会导致ArrayIndexOutOfBoundsException。您需要使用for (i <- 0 until 10) {}代替。

您还可以使用Array.tabulate方法:

// Dummy implementation
scala> def calculateCellValue(i: Int, j: Int) = 
            if (i == 0 || j == 0 || i == 9 || j == 9)  '#' else 'x'

scala> val temp = Array.tabulate(10,10)(calculateCellValue)
temp: Array[Array[Char]] = Array(Array(#, #, #, #, #, #, #, #, #, #),
                                 Array(#, x, x, x, x, x, x, x, x, #),
                                 Array(#, x, x, x, x, x, x, x, x, #),
                                 Array(#, x, x, x, x, x, x, x, x, #),
                                 Array(#, x, x, x, x, x, x, x, x, #), 
                                 Array(#, x, x, x, x, x, x, x, x, #), 
                                 Array(#, x, x, x, x, x, x, x, x, #), 
                                 Array(#, x, x, x, x, x, x, x, x, #), 
                                 Array(#, x, x, x, x, x, x, x, x, #), 
                                 Array(#, #, #, #, #, #, #, #, #, #))

答案 1 :(得分:0)

您想要Array.ofDim而不是Array[Char](10, 10),这是一个包含两个元素的数组。

另外,你的大括号是错误的。

package dims

class Room {
    val room = generate

    def generate = {
        val temp = Array.ofDim[Char](10, 10)

        for (i <- 0 until temp.length; j <- 0 until temp(0).length) {
            temp(i)(j) =
              if (i == 0 || j == 0 || i == temp.length-1 || j == temp(0).length-1) '#' else ' '
        }
        temp
    }

    def print(): Unit = {
        for (i <- 0 until room.length) {
            var line: String = ""
            for (j <- 0 until room(0).length) {
                line += room(i)(j)
            }
            println(line)
        }
    }
}
object Test extends App {
  val r = new Room
  r.print()
}