3 Stimmen

Wie fügt man diese Hashtabelle in Clojure ein?

Ich habe einen Dokumentenhash, der eine Referenz wie diese ist:

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

Es sieht folgendermaßen aus

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

Wie kann ich diese Hashtabelle ergänzen?

(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))))))
  • Ich möchte die Termdetails für die Dokumente aktualisieren
  • Jedes Mal, wenn ein neuer Begriff hinzukommt, möchte ich die Begriffsdetails abrufen und die Begriffe und ihre Anzahl aktualisieren
  • anfangs ist der Hash leer

Aber dies wirft die Null-Zeiger-Ausnahme, weil der Begriff-Detail-Hash nicht erstellt wird, wenn ich versuche, den Begriff-Nummer hinzufügen.

1voto

Brian Carper Punkte 68444
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}}

1voto

Eric Normand Punkte 3616

Hier ist eine Neuformulierung Ihrer Funktion, die funktionieren sollte. Sie verwendet die Eingetragen bei Funktion

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

0voto

Arthur Ulfeldt Punkte 89086

Eine andere Art, die Frage zu formulieren, wäre, wenn ich sie richtig verstehe: "Wie schreibe ich eine Funktion, um ein weiteres [term, count]-Paar zu einer Map hinzuzufügen?".

eine kleine Hilfsfunktion, um die aktuellen Details für eine Karte zu erhalten, wenn diese Karte noch nicht hinzugefügt wurde, dann hat sie natürlich keine Details, also stelle ich dies mit einer leeren Karte dar
Damit ist das Problem gelöst, wo die erste Termnummer hinzugefügt werden soll:

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

dann so etwas wie:

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

um es tatsächlich zum Hash hinzuzufügen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X