【问题标题】:How do you add in this hash table in Clojure?你如何在 Clojure 中添加这个哈希表?
【发布时间】:2009-10-06 20:38:28
【问题描述】:

我有一个文档哈希,它是这样的参考:

(def *document-hash* (ref (hash-map)))  

看起来像这样

 {"documentid" {:term-detail {"term1" count1 ,"term2" count2},  "doclen" 33}}}

如何添加到这个哈希表?现在我有

(defn add-doc-hash [docid  term-number count]
  (dosync (alter *document-hash*
    (fn [a-hash]
      (assoc a-hash docid {:term-detail  
        (assoc ((a-hash docid)) :term-detail) term-number count), :doclen 33))))))
  • 我想更新文档的术语详细信息
  • 每次出现新术语时,我都想获取术语详细信息并更新术语及其计数
  • 最初哈希是空的

但这会引发空指针异常,因为当我尝试添加术语编号时未创建术语详细哈希。

【问题讨论】:

    标签: clojure hashmap


    【解决方案1】:
    user> (def x (ref {"documentid" {:term-detail {"term1" 1 ,"term2" 2},  "doclen" 33}}))
    #'user/x
    user> (dosync (alter x assoc-in ["documentid" :term-detail "term3"] 0))
    {"documentid" {:term-detail {"term3" 0, "term1" 1, "term2" 2}, "doclen" 33}}
    user> (dosync (alter x update-in ["documentid" :term-detail "term3"] inc))
    {"documentid" {:term-detail {"term3" 1, "term1" 1, "term2" 2}, "doclen" 33}}
    

    【讨论】:

    • 您还可以利用 update-in 创建节点这一事实: user=> (update-in {} [:hi :mum] #(if % (inc %) 0)) - > {:hi {:mum 0}}
    【解决方案2】:

    这是对您应该可以工作的函数的重写。它使用assoc-in 函数

    (defn add-doc-hash [docid  term-number count]
      (dosync (alter *document-hash* assoc-in [docid :term-detail term-number] count)))
    

    【讨论】:

      【解决方案3】:

      如果我理解正确的话,另一种表述问题的方式是: “我如何编写一个函数来将另一个 [term, count] 对添加到地图中。”

      一个小辅助函数来获取地图的当前详细信息,如果尚未添加该地图,那么显然它将没有详细信息,所以我用一个空地图表示它
      这解决了您在哪里添加第一个术语号的问题:

      (defn get-term-detail [a-hash docid]
        (let [entry (a-hash docid)]
          (if nil? entry)
             {}
             (:term-details entry))))
      

      然后类似:

      (assoc a-hash docid {:term-details (assoc (get-term-detail a-hash docid) term-number count)        :doclen 33)
      

      实际将其添加到哈希中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-21
        • 2019-10-02
        • 1970-01-01
        • 2013-08-22
        • 1970-01-01
        • 2021-10-20
        • 2015-12-03
        • 1970-01-01
        相关资源
        最近更新 更多