2015-06-05 7 views
2

Learning Clojure (и функциональное программирование) Я наткнулся на проблему преобразования изменяемого n-арного дерева, представленного в виде вложенного java.util.ArrayList s в постоянное дерево.Mutable tree to persistent tree

Используя нефункциональное программирование, вы обычно создаете дерево от корня до листьев. Это не представляется возможным с использованием постоянных структур данных.

Может ли кто-нибудь показать мне, как построить неизменяемое дерево с измененным n-арным деревом?

+0

Это старт: https://gist.github.com/st/db8b11f5bff4cbff81b3 – ClojureMostly

ответ

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)))