Hassan Shahin
Hassan Shahin

Reputation: 211

A vector of maps into a tree

I have a collection that has the following structure [{:a 0} {:b 1} {:c 1} {:d 2} {:e 3} {:f 2}]. Basically, it is a tree, where an element of the vector is a node. What the number signify is the parent-child relationship. So, the element {:a 0} is the master parent (has no parents), while {:b 1}, {:c 1} are childs of {:a 0}. Also, {:d 2} is a child of {:c 1}.

What I want is to construct a list or a vector (doesn't matter at this point) that has the following structure: [{:a {:b nil :c {:d {:e nil} :f nil}}}].

How can this be achieved?

Upvotes: 1

Views: 176

Answers (1)

Olim Saidov
Olim Saidov

Reputation: 2844

This should work:

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

As @jas mentioned we can't rely on key-order of map, so here we use lvl map to keep last seen element's path per level.

Upvotes: 5

Related Questions