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。
原有代码错误分析
第一种循环
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。
- 嵌套逻辑冗余:不必要遍历
第二种循环
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
相关产品推荐
相关产品推荐

