2

我有一个未排序的地图序列(电视节目)需要合并,这意味着生成的序列基于特殊键 (:title) 是唯一的,并且其他键与重复项合并。可以将其视为将特定电视节目的所有放映合并到一个包含有关它们的所有信息的单个条目中。

一个程序看起来像这样(简化):

[{: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))))))

我试图弄清楚如何并行进行此合并。但是,由于在循环的每次迭代之后,开始序列的“随机”元素都被删除了,所以它必须是某种分而治之的方法。

关于如何做到这一点的任何想法?

4

1 回答 1

3

Clojure 1.5 中的Reducers功能正是您想要的。

于 2013-02-15T20:01:02.083 回答