объединение clojure между объектами

#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=>