2013-09-27 57 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來說是新的,並且使得這種函數更簡潔一些。