2009-10-06 3 views

答えて

4

あなたはキー値ペアの後に比較候補を指定することによってsorted-map-byを使用します。コンパレータは、2つのキーを取り、第1のキーが第2のキーより小さいか等しいか大きいかに応じて-1,0または1を返す関数です。

例:

user=> (sorted-map-by (fn [k1 k2] (compare (mod k1 10) (mod k2 10))) 10 1 23 4 2 5) 
{10 1, 2 5, 23 4} 

comparisson機能のみを引数として鍵がかかるので、あなたは値によってソートするためにこれを使用することはできません。

マップが値によってソートされているソートマップを持つ方法はありません。そうであれば、注文を使用してエントリの場所を決定することができないため(注文はキーに依存しないため)、キーによるエントリを見つけることはできません。

+1

-map-by – tangrammer

16

もう1つの方法は、比較関数内の元のマップの値を比較することです。私は「あなたがた値に応じてマップをソートしたい場合は...」あなたが逆の意味を読み取ることができると思いますhttp://clojuredocs.org/clojure_core/clojure.core/sortedドキュメントページで

(def my-map {:chad 3 :bob 5 :sammy 4}) 

;; sort by keys ascending 
(into (sorted-map) my-map) 
=> {:bob 5, :chad 3, :sammy 4} 

;; sort by values ascending 
(into (sorted-map-by (fn [key1 key2] (compare (key1 my-map) (key2 my-map)))) my-map) 
=> {:chad 3, :sammy 4, :bob 5} 

;; sort by values descending 
(into (sorted-map-by (fn [key1 key2] (compare (key2 my-map) (key1 my-map)))) my-map) 
=> {:bob 5, :sammy 4, :chad 3} 
+2

解決策にバグがあります。 (def my-map {:チャド3:ボブ5:アリス3:サミー4}) あなたのソリューションでは、アリス3は結果のマップから切り離されます。 –

+0

@ AlfredoDiNapoli私は同じ問題に気づいた。私は無名関数でcompareの代わりに<=を使って修正できました。 – Rafael

+0

@Rafaelは、 'sorted-map-by'の実装に私のコードをバインドする' compare'の代わりに '<='を使う考えですか? Clojure Docsは 'sorted-map-by'のユースケースを参照し、そのような解決法を提案しています: '((key1 my-map2)key1と比較して) (key2 my-map2)key2]))))my-map2) '代わりに – mjaskowski

関連する問題