我從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._非常混亂。:)我有後者。 –