2016-07-12 99 views
-1

我有一個像在地圖列表比較值的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的地圖列表。

我也有一個像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_size超出指定的值。問題是大小是字符串格式,必須考慮單位。

你能幫我一個辦法在clojure做到這一點?

+3

你能告訴我們你嘗試過這麼遠嗎? – OlegTheCat

+0

您可以使用像http://clojuredocs.org/clojure.core/re-seq這樣的正則表達式從大小字符串中提取數字和單位,然後使用parseDouble解析數字:https://docs.oracle.com/ JavaSE的/ 8 /文檔/ API /爪哇/郎/ Double.html#parseDouble-java.lang.String- –

回答

0

我不明白爲什麼人們投下你的問題。我認爲作爲一個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內住在同一地圖數據,讓您不必重複狀態就像你在limitslistofmaps現在。但是,如果由於某種原因,您需要第二張地圖,這裏是一段難看的代碼,它返回的地圖列表與您的listofmaps中的相同,並帶有兩個添加的鍵/ 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)))))