Clojure 如何使用“按值排序”对地图进行排序?

Clojure 如何使用“按值排序”对地图进行排序?,clojure,Clojure,我根本看不懂文件 我想要一个排序的映射“xxx”,它根据值对映射进行排序。我该怎么做 谢谢。您可以通过指定一个comparison,后跟键值对来使用排序映射。比较器是一个函数,它接受两个键并根据第一个键是否小于、等于或大于第二个键返回-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} 因为comparison函数只接

我根本看不懂文件

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


谢谢。

您可以通过指定一个comparison,后跟键值对来使用排序映射。比较器是一个函数,它接受两个键并根据第一个键是否小于、等于或大于第二个键返回-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}
因为comparison函数只接受键作为参数,所以不能使用它按值排序


如果映射是按值排序的,则无法获得已排序的映射。如果是,则无法按键查找条目,因为无法使用顺序确定条目的位置(因为顺序不取决于键)。

另一种方法是在比较器函数中比较原始映射的值

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

注意,您的解决方案中有一个错误,请检查:(def my map{:chad 3:bob 5:alice 3:sammy 4})使用您的解决方案,:alice 3将从生成的映射中删除。@alfreddinapoli注意到了同样的问题。我能够修复它,使用的不是@Rafael在doc页面中使用
的想法,我认为您可以阅读相反的意思“如果您希望根据值对地图进行排序,…”,正如@sepp2k所解释的,这在Clojure core的排序地图中通常是不可能的——它们的顺序基于键排序顺序。查看一个支持这一点的抽象。