No puedo entender la documentación en absoluto.¿Cómo se usa sorted-map-by en Clojure?
Quiero un mapa ordenado "xxx", que ordena el mapa según el valor. ¿Cómo puedo hacer eso?
Gracias.
No puedo entender la documentación en absoluto.¿Cómo se usa sorted-map-by en Clojure?
Quiero un mapa ordenado "xxx", que ordena el mapa según el valor. ¿Cómo puedo hacer eso?
Gracias.
Utiliza ordenado-mapa-por especificando una comparación seguida de la clave-valor-pares. El comparador es una función que toma dos claves y devuelve -1, 0 o 1 dependiendo de si la primera clave es más pequeña que, igual o mayor que la segunda clave.
Ejemplo:
user=> (sorted-map-by (fn [k1 k2] (compare (mod k1 10) (mod k2 10))) 10 1 23 4 2 5)
{10 1, 2 5, 23 4}
Dado que la función comparisson sólo toma como argumentos claves, no se puede usar esto para la clasificación por los valores.
No hay forma de tener un mapa ordenado donde el mapa esté ordenado por los valores. Si fuera así, no sería posible encontrar una entrada por clave porque no podría usar la orden para determinar dónde está la entrada (ya que la orden no dependería de la clave).
Otra forma es comparar los valores del mapa original dentro de la función del comparador.
(def my-map {:chad 3 :bob 5 :sammy 4})
;; sort by keys ascending
(into (sorted-map) my-map)
=> {:bob 5, :chad 3, :sammy 4}
;; sort by values ascending
(into (sorted-map-by (fn [key1 key2] (compare (key1 my-map) (key2 my-map)))) my-map)
=> {:chad 3, :sammy 4, :bob 5}
;; sort by values descending
(into (sorted-map-by (fn [key1 key2] (compare (key2 my-map) (key1 my-map)))) my-map)
=> {:bob 5, :sammy 4, :chad 3}
Tenga cuidado, hay un error en su solución, verifique esto: (def my-map {: chad 3: bob 5: alice 3: sammy 4}) Con su solución,: alice 3 será cortado del mapa resultante. –
@AlfredoDiNapoli Noté el mismo problema. Pude arreglarlo, usando <= en lugar de comparar en la función anónima. – Rafael
¿No es idea de @Rafael usar '<=' en lugar de 'comparar' vinculando mi código a la implementación de' sorted-map-by'? Clojure Docs se refiere a ese caso de uso de 'sorted-map-by' y propone dicha solución: ' (en (ordenado-mapa-por (fn [clave1 clave2]) (compare [(clave1 mi-mapa2) clave1] [ (key2 my-map2) key2]))) my-map2) 'en su lugar – mjaskowski
En la página doc Creo que se puede leer la inversa significa "Si se desea ordenar el mapa de acuerdo a los valores, ..." http://clojuredocs.org/clojure_core/clojure.core/sorted -map-by – tangrammer