【问题标题】:Easiest way to search records in Clojure在 Clojure 中搜索记录的最简单方法
【发布时间】:2011-04-11 14:54:07
【问题描述】:

我在 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"}
}

:最简单的方法是什么?

【问题讨论】:

    标签: clojure


    【解决方案1】:
    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"}}
    

    这就是诀窍。

    【讨论】:

    • 太棒了!你是明星。这第一次奏效。 (PS。我也感谢您在发布之前实际测试了您的答案):)
    • 我发现的唯一问题是,当一条记录包含一个带有 nil 值的值时,就会出现空指针异常。
    • 不能按预期工作:还会返回“记录”,其中“帮助”一词也作为 :b 的值出现。
    • @Laurent - 为 Rayne 辩护,我希望它在“帮助”这个词是 :b 的值时返回记录
    • @Laurent 这就是他想要的。去写一些逆时针什么的,让我一个人呆着。 ;p
    【解决方案2】:

    全文搜索是一个不同的主题,但如果你可以使用正则表达式,我会使用类似的东西:

    (defn match [re e]
        (re-find re (:a e))
    
    (defn search [re m]
        (into #{} (filter (partial match re) m)))
    

    【讨论】:

    • 我无法让它工作。当我这样做时(搜索“帮助”),它会返回所有四个记录。无论如何都感谢您尝试
    【解决方案3】:

    (filter (comp #{"help"} :a) stuff):新组合的函数首先在目标上调用:a,然后在结果上调用#{"help"}:如果:a 属性正好是"help",则返回一个真实值。

    将其转换为一个集合,并将其封装在一个带有您想要调整的参数的函数中,留给读者作为练习。不过,坦率地说,代码非常简单,每次您想要进行“搜索”时重写它可能会更短且更易读。

    【讨论】:

    • 谢谢。我正在寻找可以搜索多个键的东西
    • 我也照做了,查看了所有阅读器宏,但我找不到任何可以将其转换为集合的宏。无论如何感谢您的提示
    • 嗯?函数set 就是这样做的。为什么要寻找阅读器宏?
    • 对不起,也许我误解了,正如您在答案中使用阅读器提到的那样。
    • “读者”是你:你目前正在阅读这个答案。 “给读者留下一些练习”是一个你可能错过的英语习语。它经常出现在教科书中,意思是:“X 是可以完成的,但它会在书中占用很多空间,无论如何你可能会喜欢自己做。”这也常常是个笑话:“X可以做,但我懒得做,你自己做吧”。
    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多