Vedendo la soluzione di amalloy coinvolge reduce
suggerito questo per me:
(def maps [{:a 1 :b 2}
{:a 11 :b 22 :c 5}
{:c 6 :a 7}])
(defn my-merge-maps
[maps]
(reduce (fn [accum [k v]]
(if (accum k)
(assoc accum k (conj (accum k) v))
(assoc accum k #{v})))
{}
(apply concat maps)))
(defn -main
[]
(println (my-merge-maps maps)))
risultato è: {:C#{5 6}, :b #{2 22}, :a #{1 7 11}}
(gfredericks Grazie per aver ricordato che stavo usando per sbaglio varargs. :))
Edit: Ed ecco un altro modo, utilizzando merge-with
:
(def maps [{:a 1 :b 2}
{:a 11 :b 22 :c 5}
{:c 6 :a 7}])
(defn build-up-set
[curr-val new-val]
(if (set? curr-val)
(conj curr-val new-val)
#{curr-val new-val}))
(defn my-merge-maps
[maps]
(apply merge-with build-up-set maps))
(defn -main
[]
(println (my-merge-maps maps)))
Questo funziona, ma solo se si conoscono in anticipo tutte le chiavi corrispondenti. Una limitazione da tenere a mente. – amalloy