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函数实现逻辑
- 先通过
hasNext确保存在可返回的元素(符合Iterator规范,调用者应先检查hasNext) - 取出当前行当前列的元素
- 移动列指针:如果当前行已遍历完,切换到下一行并重置列指针
- 返回取出的元素
完整代码示例
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
相关产品推荐
相关产品推荐

