Kotlin 2维数组初始化

8
请看下面的2D数组初始化代码,它是可行的。
class World(val size_x: Int = 256, val size_y: Int = 256) {

  var worldTiles = Array(size_x, { Array(size_y, { WorldTile() }) })

    fun generate() {
      for( x in 0..size_x-1 ) {
          for( y in 0..size_y-1 ) {
              worldTiles[x][y] = WorldTile()
          }
      }
  }
}

问题在于初始化运行两次。基本上我想在generate()函数中实例化WorldTile-Object。因此,第3行不应该在那里调用"new WorldTile"。我该怎么做?
还有这是遍历2d数组的正确Kotlin方法吗?

1
你不是已经在这里初始化了它吗:Array(size_x, { Array(size_y, { WorldTile() }) }) - Mibac
是的,那正是我想要避免的 :) 我只希望在那里定义类型,而不是初始化它。也许我需要稍后添加一些参数到WorldTile中,在for循环中计算它们。 - Khufu
据我所知,您需要一个可空数组,然后在Array(..., { /*here*/})中使用null而不是WorldTile() - Mibac
4个回答

13

您可以将worldTiles设为lateinit属性,并在generate函数中执行所有初始化操作:

class World(val size_x: Int = 256, val size_y: Int = 256) {

  lateinit var worldTiles: Array<Array<WorldTile>>

  fun generate() {
    worldTiles = Array(size_x, {
        Array(size_y, {
            WorldTile()
        })
    })
  }
}

如果在调用 generate 之前尝试访问 worldTiles,您将收到一个异常警告,说明它尚未初始化。


13

将所有内容初始化为固定值:

// A 6x5 array of Int, all set to 0.
var m = Array(6) {Array(5) {0} }

使用 lambda 进行初始化:

// a 6x5 Int array initialise i + j
var m = Array(6) { i -> Array(5) { j -> i + j } }

另一种方式:这里有一个初始化 2D 浮点数数组(3 x 6)的示例:

var a = Array(3) { FloatArray(6)} // define an 3x6 array of float numbers
for(i:Int in 0 until a.size) {
    for(j : Int in 0 until a[i].size) {
        a[i][j] = 0f // initialize with your value here.
    }
}

3
val twoDimStringArray= arrayOf(
    arrayOf("first","second"),
    arrayOf("foo"),
    arrayOf("bar","great kotlin")
)
for (i in twoDimStringArray){
    for(j in i){
        println(j)
    }
}

第一
第二
foo(占位符)
bar(占位符)
伟大的Kotlin


1
有点晚了,但如果您正在使用字符串可能会有所帮助。
//init 2d array with a fixed size: 
 var data2 = Array<Array<String>>(2) { arrayOf()}
// fill the 2d array
        data2[0] = arrayOf("123","Freddy x","27")
        data2[1] = arrayOf("124","Elon y","45")

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接