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

unj*_*nj2 9 clojure

我根本无法理解文档.

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

谢谢.

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)

  • 请注意,您的解决方案中存在一个错误,请检查:(def my-map {:chad 3:bob 5:alice 3:sammy 4})使用您的解决方案:alice 3将从生成的地图中删除. (3认同)

sep*_*p2k 6

您可以通过指定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函数仅将键作为参数,因此不能使用它来按值排序.

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