【问题标题】:merging hash map in clojure giving unexpected results在 clojure 中合并哈希映射会产生意想不到的结果
【发布时间】:2023-03-24 03:00:02
【问题描述】:

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

({: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"})

我尝试过使用合并、合并-wth、应用合并-但没有给我预期的结果。

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

谢谢。

【问题讨论】:

  • 您不是在处理两个哈希图,而是在处理 2 个序列,每个序列都包含多个哈希图。你能展示一些你尝试过的代码吗?
  • 你需要修改你的数据结构。 :TEST "A" 是否应该是表中每一“行”的键?

标签: clojure hashmap


【解决方案1】:

鉴于您的两个集合被定义为 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 的含义。

【讨论】:

  • 另一种变体:(vals (reduce #(update-in %1 [(:TEST %2)] merge %2) {} (concat coll1 coll2)))
猜你喜欢
  • 2019-04-05
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多