我在Clojure中有一个类似如下的地图:
(def stuff #{
{:a "help" :b "goodbye"}
{:c "help2" :b "goodbye"}
{:a "steve" :b "goodbye"}
{:c "hello2" :b "sue"}
}):我想提供一个搜索,以便:
(search stuff "help"):将返回:
#{
{:a "help" :b "goodbye"}
{:c "help2" :b "goodbye"}
}:最简单的方法是什么?
发布于 2011-04-12 00:06:01
user=> (defn search [s q] (select #(some (partial re-find (re-pattern q)) (vals %)) s))
#'user/search
user=> (search stuff "help")
#{{:a "help", :b "goodbye"} {:c "help2", :b "goodbye"}}这就是问题所在。
发布于 2011-04-11 23:59:12
全文搜索是一个不同的主题,但如果您可以接受regexp,我将使用如下内容:
(defn match [re e]
(re-find re (:a e))
(defn search [re m]
(into #{} (filter (partial match re) m)))发布于 2011-04-11 23:49:37
(filter (comp #{"help"} :a) stuff):新组合的函数首先在目标上调用:a,然后在结果上调用#{"help"}:如果:a属性恰好为"help",则返回一个真值。
将其转换为一个集合,并将其封装在一个函数中,其中包含您想要调整的参数,这将留给读者作为练习。不过,坦率地说,代码是如此简单,每次您想要进行“搜索”时,重写它可能会更短、更具可读性。
https://stackoverflow.com/questions/5623175
复制相似问题