我根本无法理解文档。
我想要一个有序的地图“xxx”,它根据值对地图进行排序。我该怎么做?
感谢。
答案 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函数仅将键作为参数,因此不能使用它来按值排序。
没有办法有一个有序的地图,地图按值排序。如果是,则无法按键查找条目,因为您无法使用该顺序来确定条目的位置(因为订单不依赖于密钥)。