在地图列表中的地图中重新加载键

时间:2016-07-21 06:17:08

标签: clojure

我有一个函数,它输出一个看起来像这样的地图列表:

({:size20160721 "19.94 GB", :size20160720 "19.94 GB", :size20160719 "100 GB", :directory_path "/user/1 "}
 {:size20160721 "1 GB", :size20160720 "4 GB", :size20160719 "10 GB", :directory_path "/user/2 "}
 ...
 )

如何重新排序这个地图列表,以便每个地图首先包含:directory_path,然后是:size keys,其数量可以变化,但对于所有路径都是相同的?

1 个答案:

答案 0 :(得分:2)

使用sorted-map-by,比较器始终设置:directory_path

user> 
(def data '({:size20160721 "19.94 GB", :size20160720 "19.94 GB",
             :size20160719 "100 GB", :directory_path "/user/1 "}
            {:size20160721 "1 GB", :size20160720 "4 GB",
             :size20160719 "10 GB", :directory_path "/user/2 "}))
;; #'user/data

user> 
(def dirfirst (sorted-map-by #(cond (= :directory_path %1) -1
                                    (= :directory_path %2) 1
                                    :else (compare %1 %2))))
;; #'user/dirfirst

user> (map (partial into dirfirst) data)

;; ({:directory_path "/user/1 ", :size20160719 "100 GB", 
;;   :size20160720 "19.94 GB", :size20160721 "19.94 GB"}
;;  {:directory_path "/user/2 ", :size20160719 "10 GB", 
;;   :size20160720 "4 GB", :size20160721 "1 GB"})