我有这张排序的地图:
(def my-map {1 {:foo "String_1" :ordnen 5 }
2 {:foo "String_2" :ordnen 4}
3 {:foo "String_3" :ordnen 3}
4 {:foo "String_4" :ordnen 1} })
我需要使用:ordnen 关键字中保留的值以升序方式对其进行重新排序。因此,最终的排序图将是:
{4 {:foo "String_4" :ordnen 1}
3 {:foo "String_3" :ordnen 3}
2 {:foo "String_2" :ordnen 4}
1 {:foo "String_1" :ordnen 5 }}
我尝试过:
(into (sorted-map-by (fn [key1 key2] (compare (:ordnen key1) (:ordnen key2)))) my-map)
但是我不明白如何获取和比较:ordnen 的值。
答案 0 :(得分:3)
首先通过调用val
从地图中获取值,然后在生成的子地图上,只需通过关键字拉出与:ordnen
对应的值:
(sort-by (comp :ordnen val) my-map)
答案 1 :(得分:2)
(into
(sorted-map-by
(fn [key1 key2]
(compare
[(get-in my-map [key1 :ordnen]) key1]
[(get-in my-map [key2 :ordnen]) key2])))
my-map)
因此,您想按值排序。在您的情况下,值是地图,然后您需要按该地图中的:ordnen键的值进行排序。 (获取my-map [key:ordnen])是您要排序的值,但是您需要确保比较器对唯一值起作用。因此,我们将值和键作为向量。
泰勒建议的以下方法不适用于非唯一值。我添加了另一个:ordnen 4条目。
(def my-map {1 {:foo "String_1" :ordnen 5}
2 {:foo "String_2" :ordnen 4}
3 {:foo "String_2" :ordnen 4}
4 {:foo "String_3" :ordnen 3}
5 {:foo "String_4" :ordnen 1}})
(into (sorted-map-by
(fn [key1 key2]
(compare (:ordnen (get my-map key1))
(:ordnen (get my-map key2)))))
my-map)
缺少键3的地图条目。
{5 {:foo "String_4", :ordnen 1}, 4 {:foo "String_3", :ordnen 3}, 2 {:foo "String_2", :ordnen 4}, 1 {:foo "String_1", :ordnen 5}}