gpt4 book ai didi

arrays - 在 Kotlin 中创建通用二维数组

转载 作者:IT老高 更新时间:2023-10-28 13:33:02 64 4
gpt4 key购买 nike

假设我有一个泛型类,我需要一个泛型类型 T 的二维数组。如果我尝试以下

class Matrix<T>(width: Int, height: Int) {
val data: Array<Array<T>> = Array(width, arrayOfNulls<T>(height))
}

编译器会抛出一个错误,提示“Cannot use 'T' as reified type parameter. Use a class instead.”。

最佳答案

仅仅因为语法有所改变,以下是我的看法:

class Array2D<T> (val xSize: Int, val ySize: Int, val array: Array<Array<T>>) {

companion object {

inline operator fun <reified T> invoke() = Array2D(0, 0, Array(0, { emptyArray<T>() }))

inline operator fun <reified T> invoke(xWidth: Int, yWidth: Int) =
Array2D(xWidth, yWidth, Array(xWidth, { arrayOfNulls<T>(yWidth) }))

inline operator fun <reified T> invoke(xWidth: Int, yWidth: Int, operator: (Int, Int) -> (T)): Array2D<T> {
val array = Array(xWidth, {
val x = it
Array(yWidth, {operator(x, it)})})
return Array2D(xWidth, yWidth, array)
}
}

operator fun get(x: Int, y: Int): T {
return array[x][y]
}

operator fun set(x: Int, y: Int, t: T) {
array[x][y] = t
}

inline fun forEach(operation: (T) -> Unit) {
array.forEach { it.forEach { operation.invoke(it) } }
}

inline fun forEachIndexed(operation: (x: Int, y: Int, T) -> Unit) {
array.forEachIndexed { x, p -> p.forEachIndexed { y, t -> operation.invoke(x, y, t) } }
}
}

这也允许您以与一维数组类似的方式创建二维数组,例如像

val array2D = Array2D<String>(5, 5) { x, y -> "$x $y" }

并使用索引运算符访问/设置内容:

val xy = array2D[1, 2]

关于arrays - 在 Kotlin 中创建通用二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28548647/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com