2011-08-25 23 views
12

Si tengo un mapa, por ejemplo,retorno de valores de mapa clojure en un orden específico

(def mymap { :b 1 :a 2 :d 3 :e 4 :f 5}) 

que puede utilizar Vals para obtener una secuencia de todos los valores

(vals mymap) 
;=> (1 2 3 4 5) 

cómo Cómo puedo obtener la secuencia de valores en mi propia orden de encargo, para obtener, por ejemplo,

;=> (4 2 3 1 5) 

lo que, finalmente, quiero hacer es serializar los valores en una cadena, haciendo algo como esto

(defn serialize [m sep] (apply str (concat (interpose sep (vals m)) ["\n"]))) 

(esta función ejemplo fue tomado del poste "serializar una entrada de ruta en cadena")

pero necesito para especificar el orden de los Vals.

Respuesta

23

mapas son funciones de sus teclas, por lo que se puede hacer esto:

(map mymap [:e :a :d :b :f]) 
=> (4 2 3 1 5) 
+1

Esto es increíble! –

0

En caso de que desee ordenar el mapa en función de las teclas y, a continuación, obtener los valores, Brian tiene un ejemplo de cómo hacer esto utilizando sort-by

o simplemente puede implementar su propio sort comparator

0

No quiero ordenar (aunque gracias por las sugerencias de clasificación), solo quiero especificar el orden cuando saco los valores del mapa. Encontré una forma de hacerlo: desestructurar el mapa.

(let [{:keys [a b d e f]} mymap] 
    (println e a d b f)) 
Cuestiones relacionadas