Cha*_*uin 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}
Run Code Online (Sandbox Code Playgroud)
您可以通过指定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}
Run Code Online (Sandbox Code Playgroud)
由于comparisson函数仅将键作为参数,因此不能使用它来按值排序.
没有办法有一个有序的地图,其中地图按值排序.如果是,则无法按键查找条目,因为您无法使用该顺序来确定条目的位置(因为订单不依赖于密钥).