world tutorial online hello framework examples clojure

tutorial - ¿Cómo puedo ordenar un conjunto de mapas de clojure?



clojure tutorial (5)

Tengo un conjunto de mapas algo como esto:

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

: y quiero llegar a una lista ordenada, como 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} ]

: ¿Cómo puedo hacer esto?


Creo que el fragmento de la alegría de clojure es el más pulcro.

(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 %))))


La función de sort-by es lo que estás buscando:

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


sort-by es una gran respuesta y hace que el código sea mucho mejor en los casos simples en los que funciona. Además, la función de clasificación puede tomar una función para extraer la clave de comparación de cada mapa en caso de que necesite realizar un procesamiento en cada elemento. En este ejemplo, uso una función de clasificación que extrae cada nombre y luego hace una comparación de cadenas en ellos.

(sort #(compare (:name %1) (:name %2)) data) => ({:name "a", :value "b"} {:name "b", :value "b"} {:name "c", :value "b"})

esto es útil si sus colecciones tienen nombres diferentes para ser comparados:

(sort #(compare (:value %1) (:name %2)) data) => ({:name "a", :value "b"} {:name "c", :value "b"} {:name "b", :value "b"})

La función de compare es una versión mejorada de .compareto () de java porque maneja correctamente nil y compara correctamente las colecciones de clojure. Es básicamente un atajo para usar el. opperator en la mayoría de los casos

(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

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

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


sort-by es lo que desea, pero por favor, publique fragmentos que sean realmente códigos válidos; Perdí un poco de tiempo tratando de resolver un problema que terminó porque #{{:name "a" :value "b"} {:name "a" :value "b"}} hace que el lector deje de leer.