比较 clojure 地图列表中的值

Compare values in a list of maps in clojure

我有一个像

这样的地图列表
       (def listofmaps
       ({:directory_path "/some/path/1", :directory_size "8.49 GB"} {:directory_path "/user/dod/yieldbook/yb_sec_char", :directory_size "14.1 MB"})

包含很多值和大小可以是 gb 或 mb。

我还有一个像

这样的地图限制列表
     (def limitlistofmaps
     ({:directory_path "/some/path/8", :directory_size "15.2 GB"}  {:directory_path "some/path/3", :directory_size "2.1 GB"}
     {:directory_path "/some/path/1", :directory_size "17.2 GB"})

有很多值..

如果地图列表中的任何地图与 limitlistofmaps 中的 :directory_path 相同但 :directory_size 超过指定值,我需要打印 "limit exceeded"。问题是size是字符串格式,还要考虑单位

你能帮我用 clojure 做这个吗?

我不明白为什么人们对你的问题投了反对票。我认为作为 Clojure 社区,我们做得更好。我也是 Clojure 的新手,关于这个社区我只能说一些很棒的事情。我希望它保持这种状态。

首先,为什么不将所有目录大小都放在同一个单元中?这样就更容易比较它们,比如以 KB 为单位。

这是一个函数版本,可以将任何字符串(如“100.23 Gb”、“12 B”、“123.3443 MB”)转换为表示千字节的双精度值。

(defn convert-to-kb
  "Converts a string 'number (B|KB|MB|GB)' to Double representing KBytes"
  [str]
  (let [[number-str unit] (map str/lower-case (str/split (str/trim str) #"\s+"))
        number (Double/parseDouble number-str)]
    (condp = unit
      "b"  (/ number 1000)
      "kb" number
      "mb" (* number 1000)
      "gb" (* number 1000000))))

其次,我建议您将目录大小限制放在 listofmaps 中的同一地图数据中,这样您就不会像现在这样存在状态重复限制地图列表。但是如果出于某种原因你需要第二张地图,这里有一段丑陋的代码 returns 与你的 listofmaps 相同的地图列表,添加了两个 key/val 个条目,:max_size_kb 和:directory_size_kb.

for [dir listofmaps :let [{:keys [directory_path directory_size]} dir]]
  (let [limit-map (first
                    (get (group-by :directory_path limitlistofmaps) directory_path))
        max-size-kb (convert-to-kb (:directory_size limit-map))]
    (-> dir
        (assoc :max_size_kb max-size-kb)
        (assoc :directory_size_kb (convert-to-kb directory_size)))))