Kotlin中的二维Int数组

30

在 Kotlin 中,声明指定大小的二维 Int 数组是否有最简单的方法?

val board = Array(n, { IntArray(n) })

1
这个.data = Array(rowCount) { IntArray(colCount) } - prof_FL
3个回答

22

这里是创建二维数组的新顶级函数的源代码。当 Kotlin 缺少某些功能时,可以进行扩展。然后添加 YouTrack 问题 来建议并跟踪状态。虽然在这种情况下它们与上面的代码长度差不多,但提供了更明显的命名方式来说明正在发生的事情。

public inline fun <reified INNER> array2d(sizeOuter: Int, sizeInner: Int, noinline innerInit: (Int)->INNER): Array<Array<INNER>> 
    = Array(sizeOuter) { Array<INNER>(sizeInner, innerInit) }
public fun array2dOfInt(sizeOuter: Int, sizeInner: Int): Array<IntArray> 
    = Array(sizeOuter) { IntArray(sizeInner) }
public fun array2dOfLong(sizeOuter: Int, sizeInner: Int): Array<LongArray> 
    = Array(sizeOuter) { LongArray(sizeInner) }
public fun array2dOfByte(sizeOuter: Int, sizeInner: Int): Array<ByteArray> 
    = Array(sizeOuter) { ByteArray(sizeInner) }
public fun array2dOfChar(sizeOuter: Int, sizeInner: Int): Array<CharArray> 
    = Array(sizeOuter) { CharArray(sizeInner) }
public fun array2dOfBoolean(sizeOuter: Int, sizeInner: Int): Array<BooleanArray> 
    = Array(sizeOuter) { BooleanArray(sizeInner) }

使用方法:

public fun foo() {
    val someArray = array2d<String?>(100, 10) { null }
    val intArray = array2dOfInt(100, 200)
}

你能给一些文档链接吗?我找不到任何参考和想法,Kotlin插件似乎无法解决它。 - Michele d'Amico
函数及其源代码在我的回答@Micheled'Amico中...它们不是stdlib的一部分。 - Jayson Minard
抱歉,我看到你的回答时有些懒。但是我尝试了一下,通用版本不起作用。即使它看起来正确,并且应该在运行时返回一个 Array(Array<Something>),但我收到了 java.lang.ClassCastException: [[Ljava.lang.Object; cannot be cast to [[Something; 异常。此外,在我看来,更好的签名可能是 array2d(sizeOuter: Int, sizeInner: Int, init: (Int, Int)->INNER)。我会提出一个问题来了解你的函数定义有什么问题。 - Michele d'Amico
您已经在http://stackoverflow.com/q/34514861/4101725遇到了这个问题...我在You Track上开了一个问题https://youtrack.jetbrains.com/issue/KT-10555 - Michele d'Amico

12

目前这是最简单的方法,我们稍后将使用适当的函数扩展标准库。


2
我现在有其他方法可以声明二维整数数组吗? - Ryan
7
现在是1.1.3版本。它是否是最新的版本? - thuanle

2

是的,您提供的代码是声明二维数组最简单的方法。

下面,我给您提供一个二维数组初始化和打印的示例。

fun main(args : Array<String>) {
    var num = 100

    // Array Initialization
    var twoDArray = Array(4, {IntArray(3)})
    for(i in 0..twoDArray.size - 1) {
        var rowArray = IntArray(3)
        for(j in 0..rowArray.size - 1) {
            rowArray[j] = num++
        }
        twoDArray[i] = rowArray
    }

    // Array Value Printing
    for(row in twoDArray) {
        for(j in row) {
            print(j)
            print(" ")
        }
        println("")
    }

}

但是你不需要 var rowArray = IntArray(3)。因为 Array(...) 的第二个参数会初始化每个数组元素。所以你可以这样做:val rowArray = twoDArray[i] - androidguy

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