向量到树上的地图

时间:2018-07-23 18:11:17

标签: 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}}}]。

如何实现?

1 个答案:

答案 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来保持每个级别上最后看到的元素的路径。