你如何在Clojure中使用sorted-map-by?

时间:2009-10-06 23:22:18

标签: clojure

我根本无法理解文档。

我想要一个有序的地图“xxx”,它根据值对地图进行排序。我该怎么做?

感谢。

2 个答案:

答案 0 :(得分:18)

另一种方法是比较比较器函数中原始地图的值。

(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}

答案 1 :(得分:5)

您可以通过指定comparisson后跟键值对来使用sorted-map-by。比较器是一个函数,它取两个键并返回-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函数仅将键作为参数,因此不能使用它来按值排序。

没有办法有一个有序的地图,地图按值排序。如果是,则无法按键查找条目,因为您无法使用该顺序来确定条目的位置(因为订单不依赖于密钥)。