2014-06-27 37 views
0

這是一個尷尬的問題的措辭,但說我有像這樣一組映射:在Clojure中,如何通過值中的鍵對一組地圖進行排序?

(def person-1 {:name "Joshua" :birthday {:day 5 :month 12 :year 1960}}) 
(def person-2 {:name "Louise" :birthday {:day 17 :month 4 :year 1987}}) 
(def person-3 {:name "Jessica" :birthday {:day 28 :month 5 :year 1972}}) 

(def people #{person-1 person-2 person-3}) 

我怎麼會被自己的出生月份排序people,例如?

我知道如果我想按名稱排序,我可以做(sort-by :name people),但我不確定上面的例子是如何工作的。

+0

傑西卡的出生月份應該是'5',而不是':5'。糾正。 –

回答

2

嘗試:

(sort-by (comp :year :birthday) people) 

這種種出生的人的一年。


comp需要的功能的列表,並將其構成爲單個功能,首先取參數,運行於右第一功能,取結果,然後進行向左。

有關詳細信息,請參閱comp in ClojureDocs

1

排序按需要的功能,因爲它是第一個參數,所以你可以做:

(sort-by (fn [m] (-> m :birthday :month)) people) 
+1

由於創建匿名類的宏擴展,它比comp稍微快一些(儘管不是太多) – zcaudate

0

另一種選擇是使用匿名函數:

(sort-by #(:year (:birthday %)) people) 

分享和享受。

相關問題