Has*_*hin 1 dictionary vector clojure
我有一个具有以下结构的集合[{: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}}} ].
怎么能实现这一目标?
这应该工作:
(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)))
Run Code Online (Sandbox Code Playgroud)
正如@jas所提到的,我们不能依赖于map的键顺序,所以这里我们使用lvl
map来保持每个级别上次看到的元素的路径.