我有一个函数,它输出一个看起来像这样的地图列表:
({: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,其数量可以变化,但对于所有路径都是相同的?
答案 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"})