gpt4 book ai didi

arrays - Kotlin 中二维数组的展平迭代器

转载 作者:行者123 更新时间:2023-12-02 16:37:05 25 4
gpt4 key购买 nike

我有一个Grid类是 Cell 的二维数组的包装器对象。我希望这个类实现 Iterable<Cell>接口(interface)以便在循环中使用它并直接迭代整个单元格。有没有一种简单的方法可以做到这一点? Kotlin 是否支持 yield return样式迭代器?我当前的解决方案非常冗长:

override fun iterator() = object : Iterator<Cell> {
val currentOuter = grid.iterator() // grid is object of Array<Array<Cell>>
var currentInner = if (currentOuter.hasNext()) currentOuter.next().iterator() else arrayOf<Cell>().iterator()

override fun next(): Cell {
if (!hasNext()) {
throw NoSuchElementException()
}

return if (currentInner.hasNext()) {
currentInner.next()
} else {
currentInner = currentOuter.next().iterator()
currentInner.next()
}
}

override fun hasNext(): Boolean {
return currentInner.hasNext() || currentOuter.hasNext()
}
}

最佳答案

Does Kotlin support yield return style iterators?

是的,确实如此,通过协程的功能。这是一个独立的示例:

data class Cell(val d: Int)

val grid: Array<Array<Cell>> = arrayOf(arrayOf(Cell(1), Cell(2)), arrayOf(Cell(3), Cell(4)))

fun cellSequence() = buildSequence {
grid.forEach { it.forEach { yield(it) } }
}

fun main(args: Array<String>) {
cellSequence().forEach { println(it) }
}

尽管这个特定问题可以通过 flatMap 简单地解决,但所提供的代码可以用作编写任何类型的程序代码的模板,例如:

fun complexCellSequence() = buildSequence {
yield(Cell(-1))
if (grid.size <= 2) {
yield(Cell(2))
}
for (row in grid) {
if (row.contains(Cell(1))) {
yield(Cell(1))
} else {
yield(Cell(12))
row.forEach { yield(it) }
}
}
}

如果没有协程,这将是非常重要的重写。

关于arrays - Kotlin 中二维数组的展平迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48126462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com