如何基于键对地图进行排序

时间:2014-05-01 15:27:55

标签: sorting clojure

我有以下地图:

MyVals {12 -3, 24 -9, 36 -777, 48 -3037, 180 0, 360 0, 240 0, 120 0, 0 0, 144 0, 3 0, 6 -1, 9 -1, 108 0, 60 0, 72 0, 84 0, 96 0}

我删除了零值,然后我需要按键

对其进行排序
MyValsZeroRemoved(apply merge (for [[k v] MyVals :when (not (= 0 v))] {k v}))

返回:

MyValsZeroRemoved {9 -1, 6 -1, 48 -3037, 36 -777, 24 -9, 12 -3}

然后我对它进行排序:

MyValsZeroRemovedSorted(sort MyValsZeroRemoved)

但结果是

([12 -3] [24 -9] [36 -777] [48 -3037] [6 -1] [9 -1])

如何对地图进行排序以获得所需的输出,如下所示:

([6 -1] [9 -1] [12 -3] [24 -9] [36 -777] [48 -3037])

2 个答案:

答案 0 :(得分:0)

获得该排序顺序的唯一方法是

(sort-by (comp str first) {9 7, 6 5, 3 3, 0 -1, 36 4670, 24 3203, 12 23})
;=>  ([0 -1] [12 23] [24 3203] [3 3] [36 4670] [6 5] [9 7])

将它们排序为字符串。如果您需要按关键文字对地图进行排序,那么常规排序可以

(sort {9 7, 6 5, 3 3, 0 -1, 36 4670, 24 3203, 12 23})
;=>  ([0 -1] [3 3] [6 5] [9 7] [12 23] [24 3203] [36 4670])

如果需要按值排序,或者需要转换键或值,则应使用sort-by和函数提取值以执行转换。

(sort-by second {9 7, 6 5, 3 3, 0 -1, 36 4670, 24 3203, 12 23})
;=>  ([0 -1] [3 3] [6 5] [9 7] [12 23] [24 3203] [36 4670])

答案 1 :(得分:0)

sort函数将提供您想要的输出。

user> (sort {9 7, 6 5, 3 3, 0 -1, 36 4670, 24 3203, 12 23})
([0 -1] [3 3] [6 5] [9 7] [12 23] [24 3203] [36 4670])