Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 科特林平面地图公司&;递归_Kotlin - Fatal编程技术网

Kotlin 科特林平面地图公司&;递归

Kotlin 科特林平面地图公司&;递归,kotlin,Kotlin,我有一个数据结构,它是一棵树。每个项目都有子项,它们可能有子项等: class NavigationItem( val title: String, val parent: NavigationItem? ) { val children: MutableList<NavigationItem> = mutableListOf() val isLeaf: Boolean get() = children.count() == 0

我有一个数据结构,它是一棵树。每个项目都有子项,它们可能有子项等:

class NavigationItem(
    val title: String,
    val parent: NavigationItem?
) {
    val children: MutableList<NavigationItem> = mutableListOf()
    val isLeaf: Boolean
        get() = children.count() == 0

    val allChildren: List<NavigationItem>
        get() = children.flatMap {
            it.allChildren
        }
}

这个单元测试失败了——我们只是得到一个所有子项的空列表。有人能解释一下A)kotlin中的flatMap是做什么的,B)我应该用什么来代替吗?

您对
flatMap
函数的理解似乎是正确的,您对递归的使用看起来也不错。问题是,尽管您递归了所有子对象,但实际上从未将它们中的任何一个添加到返回的列表中

这个怎么样

val allChildren: List<NavigationItem>
    get() = children + children.flatMap { it.allChildren }
val所有子项:列表
get()=children+children.flatMap{it.allChildren}
请注意,包含了
子项+
,这确保每个子项本身以及其所有子项都添加到返回的列表中


如果可能出现循环,则需要添加一些更复杂的逻辑。

谢谢!这完全正确!在其他一些语言中,
flatMap
返回已应用转换的现有列表的不可变副本。我认为
儿童+
是隐含的——感谢您的澄清!Kotlin的
flatMap
描述于此,它将每个元素转换为一个列表,然后将结果展平为一个列表。它相当于
.map{…}.flant()
val allChildren: List<NavigationItem>
    get() = children + children.flatMap { it.allChildren }