如何从Kotlin序列中的不同类中生成值?

如何从Kotlin序列中的不同类中生成值?,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我在Kotlin有一个复杂的树漫游器,它可以漫游一棵巨大的树,我希望它通过yield()输出值,这样,如果我只想(比如)提取一个值,它就不必遍历整棵树。然而,我似乎无法正确理解语法。非常简单,我想要的是能够做这样的事情: class TreeWalker { fun traverse() { // not allowed //yield("foo") } } fun main()

我在Kotlin有一个复杂的树漫游器,它可以漫游一棵巨大的树,我希望它通过yield()输出值,这样,如果我只想(比如)提取一个值,它就不必遍历整棵树。然而,我似乎无法正确理解语法。非常简单,我想要的是能够做这样的事情:

class TreeWalker {
    
    fun traverse() {
        
        // not allowed
        //yield("foo")
        
    }
}

fun main() {
    val s = sequence<String> {
        val tw = TreeWalker()
        tw.traverse()
    }
    println(s.take(1))
}
类树行者{
乐趣横移(){
//不准
//收益率(“foo”)
}
}
主要内容(){
val s=序列{
val tw=TreeWalker()
tw.traverse()
}
println(s.take(1))
}

我可以从sequence块内部在线找到的序列示例all call yield(),而不是单独的类/方法。如何执行此操作?

只能暂停和恢复暂停功能。假设您希望它在没有协同路由的情况下工作(在您自己的一端,因为
sequence
实际上在后台运行一种懒惰的协同路由),TreeWalker类将需要能够跟踪它在树中的位置的状态。
traverse()
函数应在其停止的位置继续,并返回单个项目。下面是一个虚构的简化示例,它只搜索二维数组而不是遍历树:

class TreeWalker {
    private var depth = 0
    private var positionAtDepth = 0
    
    fun traverse(): String? {
        for (level in depth until maxDepth) {
            depth = level
            for (position in positionAtDepth until maxPosition) {
                positionAtDepth = position
                val item = someTree[level][position]
                if (isAMatch(item)) {
                    return item
                }
           }
        }
        return null
    }
}

fun main() {
    val s = sequence<String> {
        val tw = TreeWalker()
        while (true) {
            tw.traverse()?.let { yield(it) } ?: break
        }
    }
    println(s.take(1))
}
类树行者{
私有变量深度=0
私有变量位置深度=0
有趣的遍历():字符串{
用于(深度调平至最大深度){
深度=水平
用于(定位深度至最大位置){
位置深度=位置
val item=someTree[level][position]
如果(匹配(项目)){
退货项目
}
}
}
返回空
}
}
主要内容(){
val s=序列{
val tw=TreeWalker()
while(true){
tw.traverse()?.let{yield(it)}?:break
}
}
println(s.take(1))
}

我相信您这样做是为了锻炼身体。重要的是要了解
yield
的实际用途。它不会立即归还任何东西,而是承诺归还某些东西。医生:这能回答你的问题吗?太棒了,谢谢。看起来我想使用回调流。仅供参考,所讨论的数据结构用于字典单词查找,并不是作为trie实现的,而是作为三元树实现的,我只是为了这个目的才了解到这一点。它的查找效率很高,但有很多节点——一个350K单词字典大约有100万个节点。这与我的TreeWalker实现非常接近,我明白了这一点。我必须进行重构才能保持这样的状态,但我认为这是一个可行的解决方案。