我从Java库中收到了一个树状结构。因为我只对树的“关键”值感兴趣,所以我试图压扁它。树是由下列种类的零个或多个:斯卡拉 - 扁平化树状结构
class R(val key: String, val nodes: java.util.List[R]) {}
用空节点代表一个分支的端部列表。可以通过以下代码构建一个示例:
val sample = List[R](
new R("1", List[R](
new R("2", List[R]().asJava),
new R("3", List[R](new R("4", List[R]().asJava))
.asJava)).asJava)).asJava
我无法编写正确的方法和有效的方法。这是我到目前为止有:
def flattenTree(tree: List[R]): List[String] = {
tree.foldLeft(List[String]())((acc, x) =>
x.key :: flattenTree(x.nodes.asScala.toList))
}
然而,当我运行此代码,效率低下,因为它可能是,我仍然得到它不正确。我的结果结果是:
>>> flattenTree(sample.asScala.toList)
res0: List[String] = List(1, 3, 4)
这意味着由于某种原因,我失去了节点与键“2”。
有人可以推荐一种正确和更有效的扁平化树的方法吗?
我不确定,也许我是东西,但是孩子们是不支持flatMap的java.util.List。我必须再次转换成Java,所以平坦的身体会变成“r.key +:r.nodes.asScala.toSeq.flatMap(flatten3)”? –
@WillIAm哦,对不起,我忘记了包括导入到我的回答 – Kolmar
Thanks!这个JavaConversions._ vs JavaConverters._非常混乱。:)我有后者。 –