使用Clojure重新排序嵌套的排序映射



我有这个排序的地图:

(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的值。

首先通过调用val从映射中获取值,然后在生成的子映射上,只需通过关键字提取与:ordnen对应的值:

(sort-by (comp :ordnen val) my-map)

正确的方法

(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 键的值进行排序。(get-in my-map [key :ordnen]( 是您要作为排序依据的值,但您需要确保比较器适用于唯一值。所以我们做了一个值和键的向量。

Taylor建议的上述方法不适用于非唯一值。我添加了另一个 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}}

最新更新