3

日時の値に基づいてマップを並べ替えようとしています。以下のコードは clj-time の関数を使用しています -

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

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

IllegalArgumentException メソッドの実装がありません: :before? プロトコルの: #'clj-time.core/DateTimeProtocol クラスで見つかりました: nil clojure.core/-cache-protocol-fn (core_deftype.clj:527)

ただし、上記の例外が発生します。私は何を間違っていますか?

4

3 に答える 3

3

これを行う必要があります:

(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))))
于 2013-03-23T11:49:41.557 に答える
3
#(-> % items :month)

に相当する

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

res1nilマップエントリをそれに与えるため、常にitemsres2nilもそうです。そして、パラメーター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>}])
于 2013-03-23T15:08:31.330 に答える