比较clojure中的地图列表中的值

时间:2016-07-12 07:06:01

标签: clojure clojure-java-interop

我有一个像

这样的地图列表
       (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"})

有很多值..

我需要打印"限制超出"如果映射列表中的任何映射具有相同的:directory_path,如limitlistofmaps,但是:directory_size超出指定的值。问题是大小是字符串格式,必须考虑单位。

你能帮我找一个在clojure中这样做的方法吗?

1 个答案:

答案 0 :(得分:0)

我不明白为什么人们会投票给你的问题。我认为作为一个Clojure社区,我们会好得多。我也是一个Clojure newb,我对社区没什么好说的。我希望它保持这种状态。

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

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

{ this.props.shouldShowAlert && <MyAlertDialog open={ true } /> }

其次,我建议您将目录大小限制放在 listofmaps 中的相同地图数据中,这样您就不会像现在一样在 limitslistofmaps <中拥有状态重复/ strong>即可。但是如果由于某种原因你需要这个第二张地图,这里有一段丑陋的代码,它返回一个与 listofmaps 相同的地图列表,其中包含两个添加的键/ val条目:max_size_kb和: directory_size_kb。

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