Thank you all for your help. This helps so much! I did try using into a number of times, but didnt get that to work. I have to admit that, except for the rudamentary examples I have not used reduce too much yet. I was reviewing Stu Halloways code on group- by and was trying to come up with a way to use reduce in this application, but am not quite there yet. I will study up!
Thanks again for the help! Base On Jun 22, 2:56 am, Justin Kramer <jkkra...@gmail.com> wrote: > I took a crack at it. Whenever I think of building up a structure, I > think of reduce or into. Like Meikel, I create a nested, sorted-map > tree first, then convert to the vector-of-maps format you describe. > > (defn add-path [root path] > (let [add-child (fn [parent child-path] > (if (get-in parent child-path) > parent > (assoc-in parent child-path > {:data (peek child-path) > :children (sorted-map)}))) > ancestor-paths (for [i (range 1 (inc (count path)))] > (vec (interpose :children (take i path))))] > (reduce add-child root ancestor-paths))) > > (defn rows->tree [rows] > {:data :root > :children (reduce add-path (sorted-map) rows)}) > > ;; Note: consumes stack space > (defn tree-map->vec [node] > (vec > (for [[k v] node] > (if (zero? (count (:children v))) > (dissoc v :children) > (assoc v :children (tree-map->vec (:children v))))))) > > ;; Example > > (def data1 [[:a1 :b1 :c1] > [:a1 :b1 :c2] > [:a1 :b2 :c3] > [:a1 :b2 :c4] > [:a2 :b3 :c5] > [:a2 :b3 :c6] > [:a2 :b4 :c7] > [:a2 :b4 :c8]]) > (use 'clojure.contrib.pprint) > (pprint (rows->tree data)) > (pprint (tree-map->vec (:children (rows->tree data)))) > > Seehttp://gist.github.com/448120for example output. > > Hope that helps, > > Justin > > On Jun 21, 10:55 pm, Base <basselh...@gmail.com> wrote: > > > Hi all - > > > This seems like it should be easy, but for some reason i have thought > > myself into a box on this and now am stuck. > > > I have a data set of rows/ columns that has some hierarchical data in > > it: > > > COLUMN A B C > > > A1 B1 C1 > > A1 B1 C2 > > A1 B2 C3 > > A1 B2 C4 > > A2 B3 C5 > > A2 B3 C6 > > A2 B4 C7 > > A2 B4 C8 > > > and i want to convert this to a nested map structure: > > [ > > {:data A1 > > :children [{:data B1 :children [{:data C1} {:data C2}]]} > > {:data B2 :children [{:data C3} {:data C4}]]} > > > {:data A2 > > :children [{:data B3 :children [{:data C5} {:data C6}]]} > > {:data B4 :children [{:data C7} {:data C8}]]} ] > > > I have tried various methods and have frustrated myself to no end. > > Any help on this would be most greatly appreciated. > > > 3 additional notes: > > 1. It would be really awesome if i could somehow specify the > > hierarchical structure so that I can reuse this (as i will have to) > > 2. I will be using this on some fairly large data sets (the largest is > > maybe 50K records). > > 3. I think that the largest number of nodes in the tree will be 3, > > but this *could* change in the future. > > > As always, any help is most appreciated. > > > Thanks > > > Base -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en