【问题标题】:Clojure working with recordsClojure 处理记录
【发布时间】:2011-12-18 19:59:42
【问题描述】:

我在 Clojure 中有一组值,我想构建类似于记录的结构。我正在尝试找出处理这些记录的最佳方式。

所以我有一个例如记录:

(defrecord Link [page url])

保存这些记录集合的最佳数据结构是什么,我可以递归地逐步遍历,同时不断更新集合?

以前我使用序列对单个值执行此操作,然后在我递归处理它们时在最后连接新链接。但现在我想保留有关每个链接的更多信息。

为清晰而编辑

我以前一直在使用地图,但是我想我一直在尝试将嵌套地图与 like 一起使用而让自己感到困惑

#{: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"} 

而不是尝试使用嵌套地图。

但是,我之所以提到记录,是因为我正在努力使用第一种地图创建方法将两张地图合并在一起。对于用于递归映射的最佳结构,我仍然有些困惑。

最终更新

好的,经过一番折腾,我终于想出了下面这段代码,它返回由以下组成的向量序列:

["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 上,可以在我的个人资料中找到。

【问题讨论】:

  • 我完全误解了你原来的问题,我会删除我的答案。
  • 我认为您的回答是恰当的,它确实添加了有关使用我首先询问的各种数据结构的相关信息。
  • 好的,我取消删除它。如果您发现它有用,其他人也可以。我希望你能得到关于所需数据结构的具体问题的答案,因为我现在想不出任何东西。

标签: clojure


【解决方案1】:

我认为您对使用树型结构还是平面结构感到困惑。 假设您有一个链接列表作为地图向量:

[ {: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 以获取链接的平面列表,而不是向量中的嵌套地图。

你可以递归地重复这个过程,直到你退出条件满足。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多