可变树到持久树

时间:2015-06-05 13:22:12

标签: java clojure tree

学习Clojure(和函数式编程)我偶然发现了将表示为嵌套java.util.ArrayList的可变n元树转换为持久树的问题。

使用非函数式编程通常会创建从根到叶的树。使用持久性数据结构似乎不可能。

有人可以告诉我如何在给定可变n-ary树的情况下构造不可变树吗?

1 个答案:

答案 0 :(得分:2)

与大多数功能一样,答案是递归。事实上,通过改变java中的一堆列表来实现功能性更加容易。您只需定义一个函数,将单个ArrayList转换为clojure列表,然后让该函数在任何子列表上递归调用。这是最简单的答案;如果你想支持地图而不是列表或其他什么,你可以添加多余的装饰。

(import '(java.util List ArrayList))
(defn lists->tree [x]
  (if (instance? List x)
    (map lists->tree x)
    x))

(lists->tree (ArrayList. [(ArrayList. [1 2 3])
                          (ArrayList. [(ArrayList. [4 5])
                                       (ArrayList. [6])])]))
((1 2 3) ((4 5) (6)))