2013-09-27 56 views
1

的,我想,以减少下列序列:Clojure的降低地图的序列,以地图矢量

({0 "Billie Verpooten"} 
{1 "10:00"} 
{2 "17:00"} 
{11 "11:10"} 
{12 "19:20"}) 

{:name "Billie Verpooten" 
:work {:1 ["10:00" "17:00"] 
     :11 ["11:10" "19:20"]}} 

,但我不知道这样做。

我想到了一个使用解构的递归函数。

+0

构建结果图背后的逻辑是什么?例如,您是否知道带有键0的地图映射到名称,以及工作号码如何“叠加”?如果你有一个任意的函数可以接收一个映射并返回适当的键值对,那就可以。 – deterb

+0

具有键'0'的映射确实总是映射到该名称,映射的其余部分包含需要连接的对(其中只有第一个键被保留,作为一种id)。 – romeovs

回答

2

有一个功能可以将序列简化为标准库中的某些东西,它被称为reduce。虽然在你的具体情况下,remove特殊情况键0第一个和partition似乎是合适的,他们的意图是成对的条目。

下面的函数给出你的问题描述的结果:

(defn build-map [maps] 
    (let [entries (map first maps) 
     key-zero? (comp zero? key)] 
    {:name (val (first (filter key-zero? entries))) 
    :work (reduce (fn [acc [[k1 v1] [k2 v2]]] 
        (assoc acc (keyword (str k1)) [v1 v2])) 
        {} 
        (partition 2 (remove key-zero? entries)))})) 
+0

啊哈!这是我在clojure词汇中实际错过的分区(我本周才开始)谢谢。 – romeovs

0

只是为了各种这里是线程的操作序列的功能表达一个答案以不同的方式:

user> (def data '({0 "Billie Verpooten"} 
        {1 "10:00"} 
        {2 "17:00"} 
        {11 "11:10"} 
        {12 "19:20"})) 

user> {:name (-> data first first val) 
     :work (as-> data x 
        (rest x) 
        (into {} x) 
        (zipmap (map first (partition 1 2 (keys x))) 
          (partition 2 (vals x))))} 

as->穿线宏对Clojure 1.5来说是新的,并且使得这种函数更简洁一些。