如何在Clojure中添加哈希表?

3

我有一个文档哈希值,它是一个类似于这样的引用:

(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))))))
  • 我想要更新文档的术语详情。
  • 每次出现新术语时,我都想获取其术语详情并更新该术语和其计数。
  • 最初哈希表为空。

但是这会抛出空指针异常,因为当我尝试添加术语编号时,术语详情哈希表尚未创建。

3个回答

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}}
- Timothy Pratley

1

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

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

0
另一种表达问题的方式,如果我理解正确的话,就是:“如何编写一个函数来将另一个[项、计数]对添加到映射中。”
为了获取映射的当前详细信息,可以编写一个小助手函数。如果该映射尚未添加,则它将没有任何详细信息,因此我用一个空映射来表示这一点。这解决了您在哪里添加第一个术语-数字的问题。
(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)

将其实际添加到哈希表中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接