地图传染媒介到树里

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}}} ].

怎么能实现这一目标?

Oli*_*dov 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)))
Run Code Online (Sandbox Code Playgroud)

正如@jas所提到的,我们不能依赖于map的键顺序,所以这里我们使用lvlmap来保持每个级别上次看到的元素的路径.