比较 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)))))
我有一个像
这样的地图列表 (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)))))