无法对包含日期时间的地图进行排序

时间:2013-03-23 11:21:03

标签: clojure

我正在尝试根据日期时间值对地图进行排序。下面的代码使用clj-time -

中的函数
(def items {:a {:time (date-time 2013 12)} :b {:time (date-time 2013 11)}})

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

IllegalArgumentException没有方法的实现:: before?的   protocol:#'clj-time.core / DateTimeProtocol for class:nil   clojure.core / -cache-protocol-fn(core_deftype.clj:527)

但是我得到了上述异常。我做错了什么?

2 个答案:

答案 0 :(得分:3)

#(-> % items :month)

的等价物
#(let [res1 (items %)
       res2 (:month res1)]
   res2)

res1始终为nil,因为您向其提供了items的地图条目,因此res2也是nil。并且before?会在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>}])

答案 1 :(得分: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))))