【发布时间】:2019-08-03 05:55:25
【问题描述】:
我是 Kotlin 的新手,我想创建一个自定义类的多维数组,允许使用 null。类似的东西
private var array_map = arrayOf<Array<Obstacle?>>()
...
array_map[1][2] = Obstacle()
我该怎么做?谢谢!
【问题讨论】:
我是 Kotlin 的新手,我想创建一个自定义类的多维数组,允许使用 null。类似的东西
private var array_map = arrayOf<Array<Obstacle?>>()
...
array_map[1][2] = Obstacle()
我该怎么做?谢谢!
【问题讨论】:
不确定这是否是您想要的,但假设Obstacle 是一个自定义类,其字段num 如下
data class Obstacle(var num: Int){}
Obstacle 对象的二维数组如下:
val array: Array<Obstacle?> = arrayOf(Obstacle(123), Obstacle(234))
val arrayOfArray: Array<Array<Obstacle?>> = arrayOf(array)
println(arrayOfArray[0][0]) // would print Obstacle(num=123)
println(arrayOfArray[0][1]) // would print Obstacle(num=234)
所以你应该如下声明你的二维数组
val arrayOfArray: Array<Array<Obstacle?>> = arrayOf()
【讨论】:
您可以使用private var arrayMap: Array<Array<Obstacle?>> = arrayOf()。只需根据需要使用Array<> 包装即可。
【讨论】:
您的代码将按原样编译。问题只是数组大小无法更改,arrayOf<Array<Obstacle?>>() 创建了一个空数组,因此array_map[1][2] = Obstacle() 在运行时失败。 (除非你在它们之间的某个地方使用array_map = ...。注意你应该更喜欢val arrayMap,它不能被重新分配,除非你有特定的理由使用var。)
如果你想让你的数组以空值开头,标准库中有arrayOfNulls,但它只创建一个一维数组,而你真正需要的是一个空数组数组。你可以写一个辅助函数:
inline fun <reified T> matrixOfNulls(n: Int, m: Int) = Array(n) { arrayOfNulls<T>(m) }
private val arrayMap = matrixOfNulls<Obstacle>(5, 5) // example arguments
【讨论】:
我在这种情况下经常使用的方法是:
arr2D = Array(sizeA) { Array(sizeB) { content } }
注意,我用字段名称替换了大小,以说明每个数字/字段代表二维数组每个维度的宽度和高度长度。
此外,content 应该替换为您要填写每个坐标的主要内容,在您的情况下,您似乎打算使用 Obstacle() 实例进行设置。如果您想在其他时候填写此内容,请输入null 或快速的Any() 参考。
在最后一种情况下,在创建之后,您可以简单地执行设置项:
arr2D[1][2] = Obstacle()
【讨论】:
如果你需要数组元素的构造函数中每个元素的索引:
声明:
var matrix: Array<Array<Obstacle?>>
实例化和初始化:
matrix = Array(numRows) { row ->
Array(numCols) { col ->
Obstacle(row, col)
}
}
【讨论】: