【问题标题】:sort a list of maps by value of a key in descending order in clojure在clojure中按键的值按降序对映射列表进行排序
【发布时间】:2016-07-08 12:52:12
【问题描述】:

我有一个目录大小为字符串的地图列表。我想按大小降序对它进行排序: 问题是它也包含单位,即 GB 或 MB

列表如下所示:

    ({:directory_path /user/dod/1, :directory_size 8.49 MB} {:directory_path /user/dod/22, :directory_size 1.66 GB} {:directory_path /user/dod/testorc, :directory_size 1.28 MB} )

按大小递减的顺序对其进行排序?

【问题讨论】:

    标签: sorting clojure hashmap clojure-java-interop


    【解决方案1】:

    你可以这样做:

    (defn str->float [s]
      (Float. s))
    
    (defn filesize->num [fs]
      (let [[size unit] (clojure.string/split fs #" ")
            size (str->float size)]
        (condp = unit
              "MB" size
              "GB" (* size 1000))))
    
    (def ->ds #(-> % :directory_size filesize->num))
    
    (defn sort-data [data]
      (sort-by ->ds #(compare %2 %1) data))
    
    (def data [{:directory_path "/user/dod/2", :directory_size "8.49 MB"}
               {:directory_path "/user/dod/22", :directory_size "1.66 GB"}
               {:directory_path "/user/dod/testorc", :directory_size "1.28 MB"}])
    
    (sort-data data)
    

    【讨论】:

    • 我无法像这样对地图矢量进行硬编码。地图列表的内容是通过代码动态生成的。我必须以某种方式对其进行重新排序,使其按大小递减顺序排列,首先以 GB 为单位,然后以 MB 为单位,全部排序
    • 我已经更正了排序并提取了一个您可以使用的sort-data 函数。
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2021-04-03
    • 2021-08-09
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多