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

Kotlin中实现自定义二维数组类Iterable接口的next方法求助

实现不规则二维数组的迭代器方案

要实现array<array<K>>类型自定义类的Iterable<K>接口,核心是通过跟踪行、列双索引来处理子数组长度不一致的问题,具体实现思路和代码如下:

核心思路

维护两个状态变量记录遍历位置:

  • currentRow:当前正在遍历的行下标
  • currentCol:当前行内的列下标

1. hasNext函数优化

先自动跳过已经遍历完的空行或已耗尽的行,确保判断的是真正还有未遍历元素的状态:

override fun hasNext(): Boolean {
    // 跳过所有已遍历完的行
    while (currentRow < data.size && currentCol >= data[currentRow].size) {
        currentRow++
        currentCol = 0
    }
    return currentRow < data.size
}

2. next函数实现逻辑

  1. 先通过hasNext确保存在可返回的元素(符合Iterator规范,调用者应先检查hasNext)
  2. 取出当前行当前列的元素
  3. 移动列指针:如果当前行已遍历完,切换到下一行并重置列指针
  4. 返回取出的元素

完整代码示例

class JaggedArray<K>(private val data: Array<Array<K>>) : Iterable<K> {
    override fun iterator(): Iterator<K> {
        return object : Iterator<K> {
            private var currentRow = 0
            private var currentCol = 0

            override fun hasNext(): Boolean {
                while (currentRow < data.size && currentCol >= data[currentRow].size) {
                    currentRow++
                    currentCol = 0
                }
                return currentRow < data.size
            }

            override fun next(): K {
                if (!hasNext()) throw NoSuchElementException("No more elements to iterate")
                val targetElement = data[currentRow][currentCol]
                // 移动遍历指针
                currentCol++
                if (currentCol >= data[currentRow].size) {
                    currentRow++
                    currentCol = 0
                }
                return targetElement
            }
        }
    }
}

额外扩展提示

  • 如果需要列优先遍历(先遍历每一列的所有行),可以调整指针逻辑:先遍历列下标,当列下标超过所有行的最大长度时切换列,同时处理行长度不足的情况
  • 如果自定义类支持动态修改内部数组,可考虑添加快速失败逻辑(比如记录修改次数,迭代时检查是否有修改)
  • 若不需要自定义迭代器的灵活性,也可以直接在iterator()中返回data.flatMap { it.asIterable() }.iterator(),但自定义迭代器的内存效率更高(无需额外生成扁平化集合)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:30:30