0

ID に基づいて配列のコレクションをマージする必要があります。

サンプルデータ:

EDIT:(Clojureのデータ構造に合わせて変更)

 [{:id 1, :region :NA, :name :Test1, :OS :W}
  {:id 1, :region :EU, :name :Test2, :OS :W}
  {:id 2, :region :AS, :name :test3, :OS :L}
  {:id 2, :region :AS, :name :test4, :OS :M}]

なります:

EDIT:(Clojureのデータ構造に合わせて変更)

[{:id 1, :region [:NA :EU], :name [:Test1 :Test2] ,:OS [:W]}
 {:id 2, :region [:AS] :name [:test3 :Test4], :OS [:L :M]}]

| | はデリミタです(変更可) できればアルファベット順もお願いします。

4

3 に答える 3

0

からの関数のいくつかの組み合わせを使用できますclojure.set(最も外側のベクトルを設定に変更した場合)。特にclojure.set/index有望に見えます。

于 2012-06-26T12:48:37.427 に答える
0

merge-with以下の例のように関数を使用できます。

まず、いくつかのヘルパー関数を定義します

(defn collect [& xs]
  (apply vector (-> xs distinct sort)))

このcollect関数は、アイテムxsが一意でソートされていることを確認し、最終的にそれらをベクトルで返します。

(defn merge-keys [k xs]
  (map #(apply merge-with collect %) (vals (group-by k xs))))

merge-keys最初にハッシュマップをxs主キーでグループ化し(あなたの場合は)、グループ化されたアイテムの各リストを取得し、上記の関数:idを使用してキーの値をマージします。collect

(def xs [{:id 1, :region :NA, :name :Test1, :OS :W}
         {:id 1, :region :EU, :name :Test2, :OS :W}
         {:id 2, :region :AS, :name :test3, :OS :L}
         {:id 2, :region :AS, :name :test4, :OS :M}])

(merge-keys :id xs)
=> ({:id [1],
     :region [:EU :NA],
     :name [:Test1 :Test2],
     :OS [:W]}
    {:id [2],
     :region [:AS],
     :name [:test3 :test4],
     :OS [:L :M]})

ただし:idキーにもベクトルが関連付けられていることに注意してください。ベクトルの代わりに単一の値をキーに関連付けるステートメントを導入することで、簡単にベクトル化を解除できます...ifcollect

(defn collect [& xs]
  (let [cs (apply vector (-> xs distinct sort))]
    (if (= 1 (count cs)) (first cs) cs)))

...またはから結果を取得してmerge-keys行う

(map #(update-in % [:id] first) result)

これは、マップ エントリのベクトルを解除するだけです:id

于 2012-09-02T00:35:32.013 に答える
0
(def data
 [{:id 1, :region :NA, :name :Test1, :OS :W}
  {:id 1, :region :EU, :name :Test2, :OS :W}
  {:id 2, :region :AS, :name :test3, :OS :L}
  {:id 2, :region :AS, :name :test4, :OS :M}])

(defn key-join
  "join of map by key , value is distinct."
  [map-list]
  (let [keys (keys (first map-list))]
       (into {} (for [k keys] [k (vec (set (map #(% k) map-list)))]))))

(defn group-reduce [key map-list]
  (let [gdata (group-by key map-list)]
    (into [] (for [[k m] gdata] (let [m (key-join m)](assoc m key ((key m) 0)))))))



user=> (group-reduce :id data)
[{:name [:Test2 :Test1], :OS [:W], :region [:EU :NA], :id 1} {:name [:test3 :test4], :OS [:L :M], :region [:AS], :id 2}]
于 2012-06-26T15:45:13.733 に答える