#object #clojure
#объект #clojure
Вопрос:
Как я могу выполнить специальное слияние следующим образом: (Где special-объединить функцию, получить два объекта, вернуть объект)
(def tab-a [
{:c '({:v 60} {:v nil})}
{:c '({:v 70} {:v 66})}
])
(def tab-b [
{:c '({:v 40} {:v 11})}
{:c '({:v 70} {:v 22})}
])
(special-merge tab-a tab-b)
=>
[
{:c ({:v 40} {:v nil} {:v 11})}
{:c ({:v 60} {:v nil} {:v nil})}
{:c ({:v 70} {:v 66} {:v 22})}
]
Спасибо
Комментарии:
1. не могли бы вы объяснить алгоритм для получения результата? почему 70 в результате только один раз и ноль в результате три раза?
2. Почему все эти карты содержат только по одной записи в каждой? Что представляют данные?
Ответ №1:
Я думаю, вы могли бы сделать это лучше:
(defn to-lookup [table]
(into {}
(for [t table] (apply hash-map ((comp (partial map :v) :c) t)))))
(defn create [lookups k]
(let [values (for [lookup lookups] (get lookup k nil))
l (map (partial hash-map :v) values)]
{:c (cons (hash-map :v k) l)}))
(defn special-merge [amp; ts]
(let [lookups (map to-lookup ts)
allkeys (->> lookups (mapcat keys) distinct sort)]
(map (partial create lookups) allkeys)))
Вывод:
user=> (pprint (special-merge tab-a tab-b))
({:c ({:v 40} {:v nil} {:v 11})}
{:c ({:v 60} {:v nil} {:v nil})}
{:c ({:v 70} {:v 66} {:v 22})})
nil
user=>