我有一个具有以下结构的集合[{:a 0} {:b 1} {:c 1} {:d 2} {:e 3} {:f 2}]。基本上,它是一棵树,其中向量的元素是一个节点。数字表示的是父子关系。因此,元素{:a 0}是主父(没有父),而{:b 1},{:c 1}是{:a 0}的子代。另外,{:d 2}是{:c 1}的子代。
我想要的是构造一个具有以下结构的列表或向量(此时无关紧要): [{:a {:b nil:c {:d {:e nil}:f nil}}}]。
如何实现?
答案 0 :(得分:5)
这应该有效:
(fn [xs]
(loop [[x & rs :as xs] xs
m {}
lvl {}]
(if (seq xs)
(let [[k l] (first x)
p (conj (lvl (dec l) []) k)]
(recur
rs
(assoc-in m p nil)
(assoc lvl l p)))
m)))
正如@jas所提到的,我们不能依靠map的键顺序,因此在这里我们使用lvl
map来保持每个级别上最后看到的元素的路径。