【发布时间】:2014-05-24 19:00:25
【问题描述】:
假设我需要比较 Scala 中的树状数据结构(例如文件系统目录或 XML 文档)。如果我展平树来创建序列很容易,但它看起来很浪费内存。所以,我想把树弄平以创建迭代器/流。是否有意义 ?你会建议什么:迭代器或流?
【问题讨论】:
标签: scala tree stream iterator
假设我需要比较 Scala 中的树状数据结构(例如文件系统目录或 XML 文档)。如果我展平树来创建序列很容易,但它看起来很浪费内存。所以,我想把树弄平以创建迭代器/流。是否有意义 ?你会建议什么:迭代器或流?
【问题讨论】:
标签: scala tree stream iterator
如果您担心内存消耗,则应避免使用流。它们最终将分配与您正在遍历的节点一样多的内存。使用流类似于展平为序列,只是它是惰性完成的。
使用迭代器可能会更好。然而,树迭代器可能难以实现。一个更简单且可能更有效的解决方案是在要比较的两棵树上简单地使用递归。例如:
def compare(a: Tree, b: Tree): Boolean = {
if (/* trees a and be are not equal */) false
else if (a.children.length != b.children.length) false
else {
for ((c1, c2) <- a.children zip b.children) {
if (!compare(c1, c2)) return false
}
true
}
}
如果您担心性能,您可能希望摆脱上面的 for-comprehension,并使用 while 循环遍历子节点。
【讨论】:
Stacks 来推送和弹出两棵树的节点并比较它们。