在clojure中合并哈希映射会产生意外结果

时间:2013-05-30 14:01:38

标签: clojure hashmap

我在clojure中合并了两个hashmaps,但它给出了意想不到的结果。以下是我合并的两个数据集:

({: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但是没有任何东西能给我预期的结果。

任何关于如何达到我想要的结果集或者为什么我实际上没有达到我所期望的结果的任何adivse也会有所帮助。

谢谢你。

1 个答案:

答案 0 :(得分:5)

鉴于您的两个集合被定义为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]。如果你想要它们,肯定有一种方法,但依赖它们与零无意义相反。