Java ライブラリから受け取ったツリー構造があります。ツリーの「キー」値のみに関心があるため、フラット化しようとしています。ツリーは、次のクラスの 0 個以上で構成されます。
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」のノードを失ったことを意味します。
誰かがこのツリーを平坦化するための正しく効率的な方法を推奨できますか?