You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何访问嵌套数组并将指定元素复制到目标数组

Kotlin 数组索引遍历与赋值问题解决

问题回顾

现有FloatArray类型的数组vertices、IntArray类型的数组indices,以及初始化为36个null值的FloatArray类型数组partial_vbo。需求是遍历indices,以其元素作为索引获取vertices中的完整FloatArray,并将这些数组复制到partial_vbo中。例如indices首个元素是[0,2,3],需依次取vertices[0]、vertices[2]、vertices[3]存入partial_vbo。

原有代码错误分析

  1. 第一种循环

    for( i in vertices.indices){
        for(j in indices.indices){
            for( k in 0..2){
                println(vertices[indices[j][k]][k])
            }
        }
    }
    
    • 嵌套逻辑冗余:不必要遍历vertices的所有索引,导致数据重复处理。
    • 输出不符合预期:仅打印单个Float值,未将完整FloatArray存入partial_vbo。
  2. 第二种循环

    for(i in vertices){
        for(j in indices){
            for(k in 0..2)
                println(i[j[k]])
        }
    }
    
    • 逻辑完全颠倒:遍历vertices的单个FloatArray后,用indices中的索引值访问该数组元素,而非用索引值获取vertices中对应的数组。当indices中的索引值(如3)超过当前FloatArray的长度(3,索引范围0-2)时,触发数组越界异常。

正确解法

遍历indices中的每个索引组,再遍历组内的每个索引值,取出vertices中对应的完整FloatArray,按顺序存入partial_vbo,用计数器跟踪赋值位置:

fun main(){
    val vertices = arrayOf(
        floatArrayOf(-1.0f,-1.0f,1.0f), floatArrayOf(1.0f,-1.0f,1.0f), 
        floatArrayOf(1.0f,1.0f,1.0f), floatArrayOf(-1.0f,1.0f,1.0f),
        floatArrayOf(-1.0f,1.0f,-1.0f), floatArrayOf(-1.0f,-1.0f,-1.0f), 
        floatArrayOf(1.0f,-1.0f,-1.0f), floatArrayOf(1.0f,1.0f,-1.0f)
    )
    val indices = arrayOf(
        intArrayOf(0,2,3), intArrayOf(0,1,2), intArrayOf(1,7,2), intArrayOf(1,6,7),
        intArrayOf(6,5,4), intArrayOf(4,7,6), intArrayOf(3,4,5), intArrayOf(3,5,0),
        intArrayOf(3,7,4), intArrayOf(3,2,7), intArrayOf(0,6,1), intArrayOf(0,5,6)
    )
    val partial_vbo = arrayOfNulls<FloatArray>(36)
    
    var currentIndex = 0 // 跟踪partial_vbo的当前赋值位置
    // 遍历每个索引组
    for (indexGroup in indices) {
        // 遍历组内的每个索引值
        for (idx in indexGroup) {
            // 取出vertices中对应索引的完整FloatArray,存入partial_vbo
            partial_vbo[currentIndex] = vertices[idx]
            currentIndex++
        }
    }
    
    // 验证结果(可选)
    partial_vbo.forEachIndexed { i, arr ->
        println("partial_vbo[$i] = ${arr?.contentToString()}")
    }
}

代码说明

  • currentIndex变量记录partial_vbo的当前位置,确保每个从vertices取出的数组按顺序存入。
  • 外层循环遍历indices中的每个索引组,内层循环遍历组内索引值,直接通过vertices[idx]获取完整FloatArray并赋值。
  • 最终partial_vbo的36个位置会被正确填充,每个位置对应indices中索引指向的vertices数组。

内容的提问来源于stack exchange,提问作者beginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:42:31