Как вы добавляете в эту хеш-таблицу в Clojure? - PullRequest
3 голосов
/ 07 октября 2009

У меня есть хеш документа, который является ссылкой, подобной этой:

(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 голос
/ 07 октября 2009
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}}
1 голос
/ 08 октября 2009

Вот переписать вашу функцию, которая должна работать. Используется функция assoc-in

(defn add-doc-hash [docid  term-number count]
  (dosync (alter *document-hash* assoc-in [docid :term-detail term-number] count)))
0 голосов
/ 07 октября 2009

Другой способ сформулировать вопрос, если я правильно понимаю, будет: «Как мне написать функцию для добавления другой пары [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)

чтобы добавить его к хешу

...