【问题标题】:How to add data to hash set in Clojure?如何将数据添加到 Clojure 中的哈希集中?
【发布时间】:2017-01-23 09:59:56
【问题描述】:

我有一组哈希图(或哈希集,哈希图数组),如下所示:

(def mydata #{{:rank 2 :page 1 :group "fish"}
              {:rank 1 :page 1 :group "mammal"}
              {:rank 3 :page 2 :group "bird"}})

我有一个像这样的新哈希图:

{:group "mammal" :name "lion" :score 566}

我想要做的基本上是将新的 hashmap 数据合并到上面的数组中,所以它看起来像这样('group' 是连接键):

#{{:rank 2 :page 1 :group "fish"}
  {:rank 1 :page 1 :group "mammal" :name "lion" :score 566}
  {:rank 3 :page 2 :group "bird"}}

我的想法是首先在数组中找到索引为 1(从零开始),然后将 assoc-in 函数与给定的新哈希图一起使用,以便“组”被忽略或保持不变,“名称”和添加了“分数”。

首先,我需要找到一种方法来获取该索引,但这就是我现在遇到的问题。

有什么简单易行的方法吗?完成的数据将被转换为 json。

(我什至不确定构建这样的哈希图数组是否是在 Clojure 中制作一些 json 数据的正确方法。至少,将一组哈希图传递给 json 库现在可以生成数据数组以json格式设置,但如果我走错了路,请给一些建议。)

【问题讨论】:

  • 您的数据结构只允许每组中的一只动物。是这样吗?
  • 是的,就是这样。它就像 RDB 模式中的 1:1 连接键。

标签: clojure hashmap hashset


【解决方案1】:

首先,哈希集在这个用例中不会给您带来任何好处(任何序列都可以,并且任何序列都将转换为 json 数组,基于我对 clojure 中 json 库的了解)

但是您描述的那种操作相当频繁,和/或集合可能很大,每次遍历整个 coll 都非常昂贵。我会将您的数据重新格式化为按组索引的地图:

(def mydata {"fish" {:rank 2 :page 1 :group "fish"}
             "mammal" {:rank 1 :page 1 :group "mammal"}
             "bird" {:rank 3 :page 2 :group "bird"}})

然后像这样更新它:

(defn update-animal [animal data]
  (update data (:group animal) merge animal))


user> (update-animal {:group "mammal" :name "lion" :score 566} mydata)
;;{"fish" {:rank 2, :page 1, :group "fish"}, 
;; "mammal" {:rank 1, :page 1, :group "mammal", :name "lion", :score 566}, 
;; "bird" {:rank 3, :page 2, :group "bird"}}

当您需要将其转换为 json 时,您只需使用 values 序列: (to-json (vals data))

【讨论】:

    【解决方案2】:

    集合没有索引。您可以迭代其所有元素,如果任何一个与新的 hashmap 匹配,则将其替换为合并的 hasmap(现有元素和新元素)。最后将结果转换为集合。

    (defn update-set 
      [baseset elem] 
      (set (map #(if (= (:group elem) (:group %)) 
                     (merge elem %) 
                     %1) 
                baseset)))
    
    
    (def mydata #{{:rank 2 :page 1 :group "fish"}
                {:rank 1 :page 1 :group "mammal"}
                {:rank 3 :page 2 :group "bird"}})
    
    (update-set mydata {:group "mammal" :name "lion" :score 566}) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2021-03-04
      • 2012-09-03
      • 2020-06-08
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多