【发布时间】:2015-05-20 20:23:39
【问题描述】:
假设我已经获得了一些节点及其直接父节点,例如:
case class Mapping(name: String, parents: Seq[String] = Nil)
val mappings = Seq(
Mapping("aaa"),
Mapping("bbb"),
Mapping("ccc"),
Mapping("ddd", Seq("aaa", "bbb")),
Mapping("eee", Seq("ccc")),
Mapping("fff", Seq("ddd")),
Mapping("ggg", Seq("aaa", "fff")),
Mapping("hhh")
)
如何在 Scala 中编写一个基于它们构建树的函数?
def buildTrees(data: Seq[Mapping]): Seq[Node] = ???
case class Node(name: String, children: Seq[Node] = Nil)
val trees = buildTrees(mappings)
private val expectedTree = Seq(
Node("aaa", Seq(
Node("ggg"),
Node("ddd", Seq(
Node("fff", Seq(
Node("ggg")
))))
)),
Node("bbb", Seq(
Node("ddd", Seq(
Node("fff", Seq(
Node("ggg")
))))
)),
Node("ccc", Seq(
Node("eee")
)),
Node("hhh", Seq())
)
if (trees == expectedTree) {
println("OK")
} else {
println("Not equal")
}
如何实现buildTrees方法?我想了一会儿,但可以得到一个优雅的解决方案。
更新:希望看到不可变数据的解决方案
【问题讨论】:
-
这看起来很奇怪,因为可以在输出中复制相同的源节点。
-
谢谢,问题已解决
-
这听起来更像是一个有向无环图 (DAG) - 在树中,一个节点有 0 或 1 个父节点,而不是多个父节点。
-
@Bergi 这是一个有效的问题,因为结果数据绝对是一棵树。源数据中的重复项被克隆到不同的分支。
-
听起来你不是在建树。映射和预期树都没有描述树(每个节点最多 1 个父节点)。