2014-11-23 140 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。