代码之家  ›  专栏  ›  技术社区  ›  aarkerio

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

  •  2
  • aarkerio  · 技术社区  · 8 年前

    我有一张分类地图:

     (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} })
    

    关键字。因此,最终排序的地图如下所示:

      {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)
    

    但我不明白如何获得和比较 :奥德宁 .

    2 回复  |  直到 8 年前
        1
  •  3
  •   Solaxun    8 年前

    首先通过调用 val ,然后在生成的子映射上,只需拉出 :ordnen via关键字:

    (sort-by (comp :ordnen val) my-map)
    
        2
  •  3
  •   Simon Polak    6 年前

    (into
     (sorted-map-by
      (fn [key1 key2]
        (compare
         [(get-in my-map [key1 :ordnen]) key1]
         [(get-in my-map [key2 :ordnen]) key2])))
     my-map)
    

    泰勒建议的上述方法对非唯一值不起作用。我又添加了一个ordnen4条目。

    (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)
    

    {5 {:foo "String_4", :ordnen 1}, 4 {:foo "String_3", :ordnen 3}, 2 {:foo "String_2", :ordnen 4}, 1 {:foo "String_1", :ordnen 5}}
    
    推荐文章