2009-10-06 5 views
3

J'ai un hachage de document est une référence comme celui-ci:Comment ajoutez-vous cette table de hachage dans Clojure?

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

Il ressemble à ce

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

Comment puis-je ajouter à cette table de hachage En ce moment je

(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)))))) 
?
  • Je veux mettre à jour le détail des détails des documents
  • Chaque fois qu'un nouveau terme vient, je veux obtenir le terme-détails et mettre à jour les termes et le nombre
  • d'abord le hachage est vide

Mais cela jette l'exception de pointeur NULL car ther hachage durée détail n'est pas créé lorsque j'essaie d'ajouter le terme-nombre.

Répondre

0

Une autre façon de formuler la question si je la comprends correctement serait: "comment écrire une fonction pour ajouter une autre paire [term, count] à une carte."

une petite fonction d'aide pour obtenir les détails actuels pour une carte, si cette carte est qu'elle aura aucun détail donc je représente pas encore ajouté, il est clair que cela avec une carte vide
cela résout votre problème de savoir où ajouter le premier terme numéro:

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

puis soemthing comme:

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

à Actuall ajouter au hachage

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}} 
+0

Vous pouvez également profiter du fait que la mise à jour en crée des noeuds: user => (mise à jour dans {} [: salut: maman] # (si% (inc%) 0)) -> {: hi {: mum 0}} –

1

Voici une réécriture de votre fonction qui devrait fonctionner. Il utilise la fonction assoc-in

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