Подтвердить что ты не робот

Как я могу сортировать набор карт clojure?

У меня есть набор карт примерно так:

#{
  {: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}
]

: как я могу это сделать?

4b9b3361

Ответ 1

Функция sort-by - это то, что вы ищете:

(def s
  #{
    {:name "d" :value "b" }
    {:name "b" :value "b" }
    {:name "c" :value "b" }
    })
(sort-by :name s)

Ответ 2

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"})

Ответ 3

(def set-of-maps #{{:name "d"}, {:name "b"}, {:name "a"}})

- > clojure.core/sort-by

(sort-by :name set-of-maps)

; => ({:name "a", :value "b"} {:name "c", :value "b"} {:name "d", :value "b"})

Ответ 4

sort-by - это то, что вы хотите, но, пожалуйста, публикуйте фрагменты, которые на самом деле действительны; Я потратил немного времени на попытку выяснить проблему, которая закончилась тем, что #{{:name "a" :value "b"} {:name "a" :value "b"}} делает читателя barf.

Ответ 5

Я считаю, что фрагмент из радости 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 %))))