Clojure的数据结构遍历/搜索
问题描述:
我希望能够做这样的事情:Clojure的数据结构遍历/搜索
(search data
list?
(fn [x] (and (list? x) (= 4 (first x))))
(fn [x] (and (set? x) (contains x 3))))
而且有它递归搜索嵌套数据结构data
:
- 第一为浅列表(例如可能在一组集合中)。
- 然后在那些最浅的列表中的那些列表中,谁的第一个元素是
4
。 - 然后在那些列出包含3
- 最浅套最后返回的项目列表在步骤3
发现之前,我推倒重来,有没有这样做的标准方式吗?
答
Clojure有遍历树的标准方法。你应该看看clojure.zip并查看tree-seq。
(loop [loc dz]
(if (end? loc)
(root loc)
(recur (next (if (= '* (node loc))
(replace loc '/) loc)))))
(loop [loc dz]
(if (end? loc)
(root loc)
(recur (next (if (= '* (node loc))
(remove loc) loc)))))
这两个clojure.zip结尾的例子似乎清楚地表明你不需要知道数据结构是什么样子。循环的使用还表明,当遍历数据结构时,您可以轻松地累积您感兴趣的值。
如果您已经知道您的数据结构,并且您应该查看更大结构中的哪个位置,则zip似乎很有用。 tree-seq有点适得其反,因为它掩盖了有问题的数据结构,并使它看起来像一个序列,所以你甚至不知道你是否在一个列表或一组集合中。 我给你一个+1,因为这些可能有助于构建我正在寻找的功能。 – z5h 2009-12-08 20:14:29
例如,我可以设置tree-seq的children函数来注入标签,这些标签可以让我知道何时穿越子结构或穿越子结构。然后,消费搜索功能可以跟踪深度以及它在更大结构中的位置。 – z5h 2009-12-08 20:17:09