Java 可变树到持久树

Java 可变树到持久树,java,clojure,tree,Java,Clojure,Tree,在学习Clojure(和函数式编程)时,我偶然发现了一个问题:如何将一个表示为嵌套java.util.ArrayLists的可变n元树转换为一个持久树 使用非函数式编程,您通常会从根到叶创建树。使用持久数据结构似乎不可能做到这一点 有人能告诉我如何在给定可变n元树的情况下构造不可变树吗?与大多数函数一样,答案是递归。事实上,从功能上讲,这比在java中改变一组列表要容易得多。您只需定义一个函数,将单个ArrayList转换为clojure列表,然后让该函数在任何子列表上递归调用自己。这是最简单的

在学习Clojure(和函数式编程)时,我偶然发现了一个问题:如何将一个表示为嵌套
java.util.ArrayList
s的可变n元树转换为一个持久树

使用非函数式编程,您通常会从根到叶创建树。使用持久数据结构似乎不可能做到这一点


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

与大多数函数一样,答案是递归。事实上,从功能上讲,这比在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)))
这是一个开始: