我正在为我的要求寻找一个好的数据结构:
假设每个Node
都可以唯一标识,我想出了一个看似有点不成熟的数据结构。
case class Node[T](data: T, children: List[Node[T]], parents: List[Node[T]])
class Forest[T](val roots: List[Node[T]]) {
// other helper methods to create the Forest
}
object Forest {
def apply[T](list: List[T]): Forest[T] = {
val roots = for (l <- list) yield Node[T](l, List.empty[Node[T]], List.empty[Node[T]])
new Forest[T](roots)
}
}
有没有人有更好的建议?
TIA
答案 0 :(得分:1)
我建议您查看Graph for Scala。该库未经过积极开发,但基本功能并不需要它,一旦您习惯了它遍历节点的方式,您就可以轻松获得许多功能。 (可能需要花一点时间考虑最好地将父/子关系放入图中;你可以制作一个有向图来表示那个,或者每个方向上有两个图,等等。)
否则,您现在拥有的基础知识缺少一个细节 - 您如何实际创建森林?现在,一个节点是不可变的,包含父和子的不可变列表,这意味着必须在节点之前创建每个节点的父节点和子节点,这意味着......呃 - 哦。
您可以通过添加额外的间接层(具有节点ID列表和将ID与实际节点相关联的映射)或通过在某处添加可变性来解决此问题(在案例类中通常有点不确定,但在这种情况下可能是它的你需要什么。)
然后,当然,你需要一堆方法来实际对森林做一些有用的事情,并提供更高层次的构建方法。