Search code examples
sortingclojurehashmapclojure-java-interop

sort a list of maps by value of a key in descending order in clojure


I have a list of maps having directory sizes as strings. I want to sort it in descending order of size: the problem is that it contains units as welL ie GB or MB

The list looks something like this:

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

hot to sort it such that it is in decreasing order of sizes?


Solution

  • You could do:

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