代码之家  ›  专栏  ›  技术社区  ›  foseja

在Kotlin中将Array<Int>转换为IntArray时丢失值

  •  2
  • foseja  · 技术社区  · 2 年前

    我初始化了int的二维数组,如下所示

    var array = Array(n) { Array(n) { 0 } }
    

    然后我做了一些逻辑 array 以填充值。

    当涉及到转换的行值时 大堆 (所以 Array<Int> 类型)到 IntArray 类型使用 .toIntArray() ,根据如何执行相应的函数调用,它的行为会有所不同。( toIntArray() contentToString() )
    请看一下我在安卓工作室的XXX.kts暂存文件上运行的这张截图。 enter image description here

    test2 导致值返回0。 test 使用前面提到的逻辑保持填充的值。

    我搞不清楚这里发生了什么事。

    我会感激的

    1. 如果您能解释为什么相同的函数调用,但不同的调用方式会导致不同的输出。
    2. 如果你能提出一种转换的方法 数组<Int> IntArray (我想可能是在二维数组中)

    [更新]
    很抱歉,我没有附加代码的逻辑部分。
    代码是这样的。(我更改了一个逻辑部分,但它几乎完全相同。逻辑基本上是在数组中分配整数。)

    for (i in 0..5) {
        for (j in 0..5) {
            array[i][j] = i + j
        }
    }
    
    val test = array[0]
    println(test.contentToString())
    val test2 = test.toIntArray()
    println(test.toIntArray().contentToString())
    println(test2.contentToString())
    

    带有代码的屏幕截图如下所示。 enter image description here

    [更新2]
    为了清楚地运行代码,请确保初始化 n 在初始化之前的最开始是特定的数字 大堆 。所以应该是这样的。

    val n = 6
    var array = Array(n) { Array(n) { 0 } }
    
    1 回复  |  直到 2 年前
        1
  •  2
  •   Scott Stanchfield    2 年前

    我可以从头开始复制,但它在我作为Kotlin应用程序运行的主应用程序中运行良好。我认为IntelliJ中使用的交互模式一定存在错误。(选中“使用REPL”时效果良好)

    这会导致不良行为:

    var n = 0
    
    val array = Array(6) { Array(6) { 0 } }
    for (i in 0..5) {
        for (j in 0..5) {
            array[i][j] = i + j
        }
    }
    
    val test = array[0]
    println(test.contentToString())
    val test2 = test.toIntArray()
    println(test.toIntArray().contentToString())
    println(test2.contentToString())
    

    我已提交 a bug report IntelliJ。

    这似乎与 this bug 它展示了一个更简单的情况(我刚刚测试了它,并显示了 10 ):

    // code from related bug report
    var a = 10
    a = 20
    val t = a
    t // prints 10, but 20 is expected
    

    相关漏洞于四年前提交,最后一次评论是在2022年。我投了赞成票,希望新的错误能让人们重新审视这个问题。