我在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"}
}
:最简单的方法是什么?
答案 0 :(得分:7)
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"}}
这就是诀窍。
答案 1 :(得分:2)
全文搜索是一个不同的主题,但如果你可以使用正则表达式,我会使用类似的东西:
(defn match [re e]
(re-find re (:a e))
(defn search [re m]
(into #{} (filter (partial match re) m)))
答案 2 :(得分:1)
(filter (comp #{"help"} :a) stuff)
:新组合的函数首先在目标上调用:a
,然后在结果上调用#{"help"}
:如果:a
属性为"help"
,则返回真值完全{{1}}。
将其转换为集合,并将其封装在具有您想要调整的参数的函数中,留给读者练习。但坦率地说,代码非常简单,每次想要进行“搜索”时,重写代码的速度可能会更短,更具可读性。