【问题标题】:Two-dimensional Int array in KotlinKotlin 中的二维 Int 数组
【发布时间】:2017-07-20 12:12:53
【问题描述】:

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

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

【问题讨论】:

  • this.data = Array(rowCount) { IntArray(colCount) } 语义改变了

标签: arrays kotlin


【解决方案1】:

这里是用于创建二维数组的新顶级函数的源代码。当 Kotlin 缺少某些东西时,扩展它。然后添加YouTrack issues 用于您想要建议的内容并跟踪状态。虽然在这种情况下它们并没有比上面的短很多,但至少为正在发生的事情提供了一个更明显的命名。

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)
}

【讨论】:

  • 你能给一些文档的链接吗?我可以找到任何参考,但 Idea kotlin 插件接缝无法解决。
  • 函数及其源代码在我的答案@Micheled'Amico 中......它们不是标准库的一部分。
  • 抱歉,我回复你的答案时太懒了。 ....但我试过了,通用版本不起作用。即使它接缝正确,它应该在运行时返回Array(Array&lt;Something&gt;) 我收到java.lang.ClassCastException: [[Ljava.lang.Object; cannot be cast to [[Something; 异常。此外,恕我直言,更好的签名可以是array2d(sizeOuter: Int, sizeInner: Int, init: (Int, Int)-&gt;INNER)。我将提出一个问题以了解您的函数定义有什么问题。
  • 您已经在stackoverflow.com/q/34514861/4101725 遇到了这个问题...我在 You Track youtrack.jetbrains.com/issue/KT-10555 上打开了一个问题
【解决方案2】:

目前这是最简单的方法,我们稍后会用适当的功能扩展标准库

【讨论】:

  • 我现在还有其他方法可以声明二维Int数组吗?
  • 现在是 1.1.3。它是最新的吗?
【解决方案3】:

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

下面,我给你一个二维数组初始化和打印的例子。

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]
猜你喜欢
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2015-04-17
  • 1970-01-01
相关资源
最近更新 更多