我在Clojure中有一组值,我希望构造类似于record。我正在试图找出处理这些记录的最佳方法。
所以我有一个例如记录:
(defrecord Link [page url])
什么是最好的数据结构来保存这些记录的集合,我可以递归地逐步完成,同时不断更新集合?
以前我在使用序列的单个值上完成了这个,然后在递归处理它们时在最后连接新的链接。但现在我想了解有关每个链接的更多信息。
编辑清晰度
我以前一直在使用地图,但是我觉得我一直在试图使用类似
的嵌套地图而让自己感到困惑#{:rootlink "http://www.google.co.uk" :links nestedmapoflinks}
当我试图通过它来诅咒时,这让我感到困惑。
下面是我一直在使用的代码,下面是目前使用的一系列链接,但没有关于链接的其他信息。
(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)))))))))
我想我必须使用
将每个项目添加到地图中{:rootlink "http://www.google.co.uk" :link "http://someurlontherootlinkpage.com"}
而不是尝试使用嵌套地图。
然而,我提到记录的原因,是因为我正在努力使用第一种地图创建方法将两个地图合并在一起。我仍然对用于递归地图的最佳结构感到困惑。
最终更新
好的,所以在经过多次争吵之后,我终于想出了下面这段代码,它返回了由以下内容组成的seq:
["root link address" "link"]
["http://www.google.co.uk" "http://www.google.co.uk/examplelink"]
代码:
(defn get-links
[url]
(map #(vector url %)(map :href (map :attrs (html/select (fetch-url url) [:a])))))
现在我的github上的代码可以在我的个人资料中找到。
答案 0 :(得分:1)
我认为您在使用Tree类型结构或平面结构时感到困惑。 假设您有一个链接列表作为地图矢量:
[ {:root nil :link "A.COM"} {:root nil :link "B.COM"} ]
现在您映射并使用您获得的get-link
方法:
[ [ {:root nil :link "A.COM"} {:root "A.COM" :link "Aa.COM"} {:root "A.COM" :link "Ab.COM"} ] [ {:root nil :link "B.COM"} {:root "B.COM" :link "Ba.COM"} {:root "B.COM" :link "Bb.COM"}] ]
现在,您可以在此结果上调用flatten
以获取链接的平面列表,而不是矢量中的嵌套地图。
您可以递归重复此过程,直到退出条件满足。