我有以下地图:
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])
答案 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])