2014-11-23 80 views
0

我想知道什麼是遍歷許多集合以在clojure中創建地圖的最佳方式。其實我有3個系列:Clojure,將集合轉換爲地圖

("Aujourd'hui" "Demain" "25.11" "26.11" "27.11" "28.11" "29.11") 
("2 °C" "2 °C" "1 °C" "0 °C" "-3 °C" "-4 °C" "0 °C") 
("8 °C" "6 °C" "4 °C" "2 °C" "1 °C" "1 °C" "5 °C") 

,我喜歡創造這樣看的地圖集合:

{:date Aujourd'hui :temp-min 2°C :temp-max 8°C}{...} 

,知道它不應該這麼困難,但我無法弄清楚如何做對了。

感謝您的幫助!

回答

3

我們可以使用map爲集合的每個索引構造一個哈希映射。當提供兩個以上的參數時,地圖會並行移動通過所有集合。

user> (let [dates '("Aujourd'hui" "Demain" "25.11" "26.11" "27.11" "28.11" "29.11") 
      mins '("2 °C" "2 °C" "1 °C" "0 °C" "-3 °C" "-4 °C" "0 °C") 
      maxes '("8 °C" "6 °C" "4 °C" "2 °C" "1 °C" "1 °C" "5 °C")] 
     (pprint (map #(hash-map :date %1 :temp-min %2 :temp-max %3) dates mins maxes))) 
({:date "Aujourd'hui", :temp-max "8 °C", :temp-min "2 °C"} 
{:date "Demain", :temp-max "6 °C", :temp-min "2 °C"} 
{:date "25.11", :temp-max "4 °C", :temp-min "1 °C"} 
{:date "26.11", :temp-max "2 °C", :temp-min "0 °C"} 
{:date "27.11", :temp-max "1 °C", :temp-min "-3 °C"} 
{:date "28.11", :temp-max "1 °C", :temp-min "-4 °C"} 
{:date "29.11", :temp-max "5 °C", :temp-min "0 °C"}) 
1

下面的函數構造一個表作爲從列標題的columnstitles和順序的記錄序列:

(defn build-table [titles columns] 
    (apply map (fn [& xs] (zipmap titles xs)) columns)) 

應該有儘可能多的:titles因爲有columns

例如,

(build-table [:date :temp-min :temp-max] data) 

其中

(def data ['("Aujourd'hui" "Demain" "25.11" "26.11" "27.11" "28.11" "29.11") 
      '("2 °C" "2 °C" "1 °C" "0 °C" "-3 °C" "-4 °C" "0 °C") 
      '("8 °C" "6 °C" "4 °C" "2 °C" "1 °C" "1 °C" "5 °C")]) 

...產生

({:temp-max "8 °C", :temp-min "2 °C", :date "Aujourd'hui"} 
    {:temp-max "6 °C", :temp-min "2 °C", :date "Demain"} 
    {:temp-max "4 °C", :temp-min "1 °C", :date "25.11"} 
    {:temp-max "2 °C", :temp-min "0 °C", :date "26.11"} 
    {:temp-max "1 °C", :temp-min "-3 °C", :date "27.11"} 
    {:temp-max "1 °C", :temp-min "-4 °C", :date "28.11"} 
    {:temp-max "5 °C", :temp-min "0 °C", :date "29.11"}) 

這使得所有數據元素爲字符串。將它們轉換爲數字,最好附帶單位,可以獨立處理。正如他們寫的,如2°C是無效的Clojure。