2013-02-15 42 views
2

我有一個我需要合併的未映射序列的地圖(電視節目),這意味着結果序列是基於特殊鍵(:title)而唯一的,而其他鍵與重複項合併。把它看作是把一個特定電視節目的所有放映合併成一個單獨的條目,以保存所有關於它們的信息。我該如何減少Clojure序列

的程序看起來像這樣(簡化):

[{:prog {:title "", ...} :starts #{} :directors #{} :actors #{} :categories {}}, ...] 

這是我目前的函數,它合併:

(defn- merge-programs [all-programs] 
    "Merge all instances of the same program" 
    (loop [acc  [] 
      programs all-programs] 
     (if (empty? programs) 
      acc 
      (let [first-prog (first programs) 
        dups  (filter #(= (:title first-prog) (:title (:prog %))) programs) 
        merged-prog {:prog  first-prog 
           :starts  (apply set/union (map :starts  dups)) 
           :directors (apply set/union (map :directors dups)) 
           :actors  (apply set/union (map :actors  dups)) 
           :categories (apply set/union (map :categories dups))}] 
       (recur (conj acc merged-prog) 
         (remove #(= (:title first-prog) (:title (:prog %)))) programs)))))) 

我試圖找出如何做到這一點的合併並行。但是,由於在循環的每次迭代之後,起始序列的「隨機」元素將被刪除,因此必須採取一些分而治之的方法。

有關如何做到這一點的任何想法?

回答