Ответ 1
Функция sort-by - это то, что вы ищете:
(def s
#{
{:name "d" :value "b" }
{:name "b" :value "b" }
{:name "c" :value "b" }
})
(sort-by :name s)
У меня есть набор карт примерно так:
#{
{:name "a" :value "b" ... more stuff here}
{:name "b" :value "b" ... more stuff here}
{:name "b" :value "b" ... more stuff here}
{:name "a" :value "b" ... more stuff here}
{:name "c" :value "b" ... more stuff here}
{:name "a" :value "b" ... more stuff here}
}
: и я хочу попасть в упорядоченный список, похожий на sql order-by name:
[
{:name "a" :value "b" ... more stuff here}
{:name "a" :value "b" ... more stuff here}
{:name "a" :value "b" ... more stuff here}
{:name "b" :value "b" ... more stuff here}
{:name "b" :value "b" ... more stuff here}
{:name "c" :value "b" ... more stuff here}
]
: как я могу это сделать?
Функция sort-by - это то, что вы ищете:
(def s
#{
{:name "d" :value "b" }
{:name "b" :value "b" }
{:name "c" :value "b" }
})
(sort-by :name s)
sort-by - отличный ответ и делает код намного лучше в простых случаях, когда он работает. Кроме того, функция сортировки может принимать функцию для извлечения ключа сравнения из каждой карты, если вам нужно выполнить некоторую обработку для каждого элемента. В этом примере я использую функцию сортировки, которая извлекает каждое имя, а затем сравнивает строку с ними.
(sort #(compare (:name %1) (:name %2)) data)
=> ({:name "a", :value "b"} {:name "b", :value "b"} {:name "c", :value "b"})
это полезно, если ваши коллекции имели разные имена для сравнения:
(sort #(compare (:value %1) (:name %2)) data)
=> ({:name "a", :value "b"} {:name "c", :value "b"} {:name "b", :value "b"})
Функция compare
является лучшей версией java.compareto(), потому что она правильно обрабатывает nil и правильно сопоставляет коллекции clojure. это в основном короткий разрез для использования. opperator в большинстве случаев
(sort #(. (:name %1) (compareTo (:name %2))) data)
=> ({:name "a", :value "b"} {:name "b", :value "b"} {:name "c", :value "b"})
(def set-of-maps #{{:name "d"}, {:name "b"}, {:name "a"}})
(sort-by :name set-of-maps)
; => ({:name "a", :value "b"} {:name "c", :value "b"} {:name "d", :value "b"})
sort-by
- это то, что вы хотите, но, пожалуйста, публикуйте фрагменты, которые на самом деле действительны; Я потратил немного времени на попытку выяснить проблему, которая закончилась тем, что #{{:name "a" :value "b"} {:name "a" :value "b"}}
делает читателя barf.
Я считаю, что фрагмент из радости clojure является самым опрятным.
(def plays [{:band "Burial", :plays 979, :loved 9}
{:band "Eno", :plays 2333, :loved 15}
{:band "Bill Evans", :plays 979, :loved 9}
{:band "Magma", :plays 2665, :loved 31}])
(def sort-by-loved-ratio (partial sort-by #(/ (:plays %) (:loved %))))