2

マージする必要があるマップ (テレビ番組) のソートされていないシーケンスがあります。つまり、結果のシーケンスは特別なキー (:title) に基づいて一意であり、他のキーは重複とマージされます。これは、特定のテレビ番組のすべての番組を、それらに関するすべての情報を保持する 1 つのエントリにマージするものと考えてください。

プログラムは次のようになります (簡略化)。

[{: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 に答える