请教一个算法问题

47 views
Skip to first unread message

Stream Liu

unread,
Feb 24, 2014, 11:46:52 PM2/24/14
to cn-cl...@googlegroups.com

隔了一段时间不用Clojure,基本忘光了,早上写一个数据结构方面的转换,尝试一上
午都没解决,请教群的牛人帮忙看一下。

需求是这样的有一套扁平的结构,希望能以嵌套的方式表达出来.

[{:level 1 :code "11"} {:level 2 :code "1101"} {:level 3 :code
"110101"} {:level 2 :code "1102"} {:level 3 :code "110102"}]

code 上可以看出层级关系比如 "1101" 他的上一级是 "11" 同理 "110101" 他的
上一级是 "1101".

这里希望通过Clojure能转成嵌套格式

[{:code "11" :sub [{:code "1101" :sub [{:code "110101"} {:code
"110102"}]} {:code "1102"}]}]

不知道我表达的是否清楚。

--

Gaofeng Zeng

unread,
Feb 27, 2014, 11:58:11 AM2/27/14
to cn-cl...@googlegroups.com
(def data [{:code "11", :level 1}
           {:code "1101", :level 2}
           {:code "110101", :level 3}
           {:code "1102", :level 2}
           {:code "110102", :level 3}])


(defn push [m k v]
  (if-let [vs (get m k)]
    (assoc m k (conj vs v))
    (assoc m k [v])))

(defn parent? [sup node]
  (.startsWith (:code node) (:code sup)))

(defn sub-attach [node sups]
  (for [sup sups]
    (if (parent? sup node)
      (push sup :sub node)
      sup)))

(defn sub-tree [data]
  (let [data (partition-by :level (sort-by :level > data))]
    (clojure.pprint/pprint data)
    (reduce (fn [subs sups]
              (reduce #(sub-attach %2 %1) sups subs))
            data)))

Stream Liu

unread,
Feb 27, 2014, 11:51:49 PM2/27/14
to cn-cl...@googlegroups.com

自己已经实现, 但明显没有这套清晰, 先谢之,再拜读.
Reply all
Reply to author
Forward
0 new messages