用Clojure重新排序了一个嵌套的排序图

时间:2018-10-06 20:52:52

标签: 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 的值。

2 个答案:

答案 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}}