Ich habe eine Reihe von Werten in Clojure, die ich ähnlich wie ein Datensatz strukturieren möchte. Ich versuche herauszufinden, wie ich einen Satz dieser Datensätze am besten handhaben kann.
Ich habe also zum Beispiel einen Datensatz:
(defrecord Link [page url])
Was ist die beste Datenstruktur, um eine Sammlung dieser Datensätze zu speichern, die ich rekursiv durchlaufen kann, während ich die Sammlung kontinuierlich aktualisiere?
Zuvor habe ich dies auf einen einzelnen Wert mit Sequenz getan, dann concat'ing neue Links am Ende, wie ich sie rekursiv verarbeiten. Aber jetzt möchte ich mehr Informationen über jeden Link zu halten.
Zur Verdeutlichung bearbeiten
Ich hatte zuvor Karten verwendet, aber ich glaube, ich habe mich selbst verwirrt, indem ich versucht habe, eine verschachtelte Karte zu verwenden mit wie
#{:rootlink "http://www.google.co.uk" :links nestedmapoflinks}
was mich verwirrt, wenn ich versuche, sie erneut zu durchforsten.
Unten ist der Code, den ich verwendet habe, unten ist, was derzeit mit einer Folge von Links, aber keine anderen Informationen über den Link funktioniert.
(defn get-links
[url]
(map :href (map :attrs (html/select (fetch-url url) [:a])))))
(defn process-links
[links]
(if (not (empty? links))
(do
(if (not (is-working (first links)))
(do
(println (str (first links) " is not working"))
(recur (rest links)))
(do
(println (str (first links) " is working"))
(recur (concat (rest links) (get-links (first links)))))))))
Ich denke, ich muss jedes Element in der Karte mit
{:rootlink "http://www.google.co.uk" :link "http://someurlontherootlinkpage.com"}
anstatt zu versuchen, mit der verschachtelten Karte zu arbeiten.
Der Grund, warum ich Rekorde erwähnt habe, ist, dass ich Schwierigkeiten hatte, zwei Karten mit der ersten Methode der Kartenerstellung zusammenzufügen. Ich bin immer noch ein wenig verwirrt über die beste Struktur, um die Karte zu durchsuchen.
Letzte Aktualisierung
Ok, so nach viel Gerangel kam ich schließlich mit diesem unten Stück Code, der eine Sequenz von Vektoren aus zurückgibt:
["root link address" "link"]
["http://www.google.co.uk" "http://www.google.co.uk/examplelink"]
Code:
(defn get-links
[url]
(map #(vector url %)(map :href (map :attrs (html/select (fetch-url url) [:a])))))
Der Code ist jetzt auf meinem Github in meinem Profil verfügbar.