比较Scala中的树

时间:2014-05-24 19:00:25

标签: scala tree stream iterator

假设我需要比较Scala中的树状数据结构(例如文件系统目录或XML文档)。如果我压扁树来创建序列很容易,但它看起来浪费了内存。所以,我想展平树来创建迭代器/流。是否有意义 ?你会建议什么:迭代器或流?

1 个答案:

答案 0 :(得分:2)

如果您担心内存消耗,则应避免使用流。它们将最终分配与您正在遍历的节点一样多的内存。使用流类似于扁平化到序列,只是懒得完成。

使用迭代器可能更好。但是,树迭代器实现起来可能很棘手。一种更简单,也可能更有效的解决方案是简单地在要比较的两棵树上使用递归。 E.g:

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循环遍历子节点。