2013-03-23 60 views
2

我想根據其日期時間值對地圖進行排序。下面的代碼使用函數從CLJ-時間 -無法對包含日期時間的地圖進行排序

(def items {:a {:time (date-time 2013 12)} :b {:time (date-time 2013 11)}}) 

(sort-by #(-> % items :month) before? items) 

拋出:IllegalArgumentException方法沒有實現:之前? 協議的:#'CLJ-time.core/DateTimeProtocol找到類:無 clojure.core/-cache - 協議 - FN(core_deftype.clj:527)

但是我得到上述異常。我究竟做錯了什麼 ?

回答

2

你需要這樣做:

(sort-by (fn [[k v]] (-> v :time)) before? items) 

如果你想有一個排序的映射,那麼你需要做的日期時間圖的關鍵和:A:B的值會導致分揀地圖排序上的密鑰值:

(->> (into [] items) 
     (map (fn [[k v]] [v k])) 
     (flatten) 
     (apply sorted-map-by #(before? (%1 :time) (%2 :time)))) 
+0

它的第一解決方案,我想實現,因爲我的重點不是日期時間。不過,我仍然在我的問題中提到異常。有任何想法嗎? – murtaza52 2013-03-23 12:54:05

+0

即使第二個解決方案也會拋出相同的異常... – murtaza52 2013-03-23 12:56:35

3
#(-> % items :month) 

當量至

#(let [res1 (items %) 
     res2 (:month res1)] 
    res2) 

res1始終是nil,因爲您給它的地圖條目爲items,因此res2也是nilbefore?將在nil參數中引發此異常。

試試這個

(def items {:a {:time (date-time 2013 10)} 
      :c {:time (date-time 2013 12)} 
      :b {:time (date-time 2013 11)}}) 

(sort-by (comp :time second) before? items) 

=> ([:a {:time #<DateTime 2013-10-01T00:00:00.000Z>}] 
    [:b {:time #<DateTime 2013-11-01T00:00:00.000Z>}] 
    [:c {:time #<DateTime 2013-12-01T00:00:00.000Z>}]) 
+0

+1。我喜歡comp的優雅。 – murtaza52 2013-03-24 04:43:28

相關問題