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 }