正在clojure中合并哈希映射,导致意外结果
我正在clojure中合并两个HashMap,但它会产生意想不到的结果。下面是我正在合并的两个数据集:正在clojure中合并哈希映射,导致意外结果,clojure,hashmap,Clojure,Hashmap,我正在clojure中合并两个HashMap,但它会产生意想不到的结果。下面是我正在合并的两个数据集: ({:TEST"E", :EMEA "0", :NA "0", :ASPAC "180"} {:TEST"B", :EMEA "0", :NA "70", :ASPAC "0"} {:TEST"D", :EMEA "38", :NA "0", :ASPAC "0"} {:TEST"C", :EMEA "0", :NA "0", :ASPAC "0"} {:TEST"G", :EMEA "36
({:TEST"E", :EMEA "0", :NA "0", :ASPAC "180"}
{:TEST"B", :EMEA "0", :NA "70", :ASPAC "0"}
{:TEST"D", :EMEA "38", :NA "0", :ASPAC "0"}
{:TEST"C", :EMEA "0", :NA "0", :ASPAC "0"}
{:TEST"G", :EMEA "360", :NA "0", :ASPAC "0"}
{:TEST"A", :EMEA "45", :NA "0", :ASPAC "0"}
{:TEST"F", :EMEA "0", :NA "0", :ASPAC "66"})
({:TEST"A", :EMEA_1 "40", :NA_1 "0", :ASPAC_1 "0"}
{:TEST"B", :EMEA_1 "90", :NA_1 "0", :ASPAC_1 "0"}
{:TEST"H", :EMEA_1 "0", :NA_1 "120", :ASPAC_1 "0"}
{:TEST"C", :EMEA_1 "0", :NA_1 "85", :ASPAC_1 "0"})
我期待看到这样的事情:
({:TEST"A", :EMEA "45", :NA "0", :ASPAC "0", :EMEA_1 "40", :NA_1 "0", :ASPAC_1 "0"}
{:TEST"B", :EMEA "0", :NA "70", :ASPAC "0", :EMEA_1 "90", :NA_1 "0", :ASPAC_1 "0"}
{:TEST"C", :EMEA "0", :NA "0", :ASPAC "0", :EMEA_1 "0", :NA_1 "85", :ASPAC_1 "0"}
{:TEST"D", :EMEA "38", :NA "0", :ASPAC "0", :EMEA_1 nil, :NA_1 nil, :ASPAC_1 nil}
{:TEST"E", :EMEA "0", :NA "0", :ASPAC "180", :EMEA_1 nil, :NA_1 nil, :ASPAC_1 nil}
{:TEST"F", :EMEA "0", :NA "0", :ASPAC "66", :EMEA_1 nil, :NA_1 nil, :ASPAC_1 nil}
{:TEST"G", :EMEA "360", :NA "0", :ASPAC "0", :EMEA_1 nil, :NA_1 nil, :ASPAC_1 nil}
{:TEST"H", :EMEA nil, :NA nil, :ASPAC nil, :EMEA_1 "0", :NA_1 "120", :ASPAC_1 "0"})
我尝试过使用merge,merge-wth,apply-merge-with,但是没有任何东西能给我预期的结果
任何关于我如何达到我期望的结果集或者为什么我没有达到我期望的结果的建议都会很有帮助
谢谢。鉴于您的两个集合被定义为coll1和coll2:
(map (partial apply merge) (-> (clojure.set/union coll1 coll2)
(clojure.set/index [:TEST])
vals))
应该会得到你想要的结果
如果不需要clojure.set,也可以使用
(map (partial apply merge) (->> (concat coll1 coll2)
(group-by :TEST)
vals))
然而,从您的数据结构来看,它们看起来更像clojure.set的例子
您可能会注意到,结果中不会有类似[:key nil]的条目。如果您想要它们,当然有一种方法,但依赖它们违背了“无”的含义。鉴于您的两个集合被定义为coll1和coll2:
(map (partial apply merge) (-> (clojure.set/union coll1 coll2)
(clojure.set/index [:TEST])
vals))
应该会得到你想要的结果
如果不需要clojure.set,也可以使用
(map (partial apply merge) (->> (concat coll1 coll2)
(group-by :TEST)
vals))
然而,从您的数据结构来看,它们看起来更像clojure.set的例子
您可能会注意到,结果中不会有类似[:key nil]的条目。如果您想要它们,当然有办法,但是依赖它们违背了nil作为无的含义。您处理的不是两个哈希映射,而是两个seq,每个seq包含多个哈希映射。你能展示一些你尝试过的代码吗?你需要修改你的数据结构。Is:测试“A”应该是表中每个“行”的键?您处理的不是两个哈希映射,而是两个seq,每个seq包含多个哈希映射。你能展示一些你尝试过的代码吗?你需要修改你的数据结构。是:测试“A”应该是表中每个“行”的键吗?另一个变体:
(VAL(reduce#(在%1[(测试%2)]中更新)合并%2{}(concat coll1 coll2))
另一个变体:(VAL(reduce#(在%1[(测试%2)]中更新)合并%2{}(concat coll1 coll2))