【问题标题】:Compare values in a list of maps in clojure比较clojure中地图列表中的值
【发布时间】:2016-07-12 07:06:01
【问题描述】:

我有一个地图列表,比如

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

我也有一个 limitlistofmaps 之类的

     (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 超过指定的值,我需要打印“超出限制”。问题是大小是字符串格式,需要考虑单位。

你能帮我在clojure中做到这一点吗?

【问题讨论】:

标签: clojure clojure-java-interop


【解决方案1】:

我不明白为什么人们对你的问题投了反对票。我认为作为 Clojure 社区,我们要好得多。我也是 Clojure 新手,我对社区只有好话要说。我希望它保持这种状态。

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

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

(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 中的相同地图数据中,这样您就不会像现在在 limitslistofmaps。但是如果由于某种原因你需要第二张地图,这里有一段丑陋的代码,它返回一个地图列表,这些地图与你的 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)))))

【讨论】:

    猜你喜欢
    • 2017-09-13
    • 2020-03-28
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2021-07-15
    相关资源
    最近更新 更多