Самый простой способ поиска записей в Clojure - PullRequest
3 голосов
/ 11 апреля 2011

У меня есть карта в 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"}
}

: Какой самый простой способ сделать это?

Ответы [ 3 ]

7 голосов
/ 11 апреля 2011
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"}}

Это делает трюк.

2 голосов
/ 11 апреля 2011

Полнотекстовый поиск - это отдельная тема, но если вы можете использовать регулярные выражения, я бы использовал что-то вроде:

(defn match [re e]
    (re-find re (:a e))

(defn search [re m]
    (into #{} (filter (partial match re) m)))
1 голос
/ 11 апреля 2011

(filter (comp #{"help"} :a) stuff): только что составленная функция сначала вызывает :a для цели, затем вызывает #{"help"} для результата: это возвращает истинное значение, если атрибут :a равен "help".

Преобразование этого в набор и инкапсуляция его в функцию с аргументами, которые вы хотите настроить, оставлено в качестве упражнения для читателя. Честно говоря, код настолько прост, что может быть короче и более читабельным, чтобы переписывать его каждый раз, когда вы хотите выполнить «поиск».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...