2011-08-25 12 views
12

Se ho una mappa, ad esempio,ritorno dei valori clojure mappa in un ordine specifico

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

posso usare vals per ottenere una sequenza di tutti i valori

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

come faccio ad avere la sequenza di valori nel mio ordine personalizzato, per ottenere ad esempio

;=> (4 2 3 1 5) 

quello che alla fine voglio fare è serializzare i valori in una stringa, fare qualcosa di simile

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

(questa funzione esempio è stato preso dal post "serializzare un ingresso-map nella stringa")

ma ho bisogno di specificare l'ordine delle vals.

risposta

23

mappe sono funzioni dei loro chiavi, in modo da poter fare questo:

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

Ciò è impressionante! –

0

Nel caso in cui si desidera ordinare la mappa a seconda delle chiavi, e quindi ottenere i valori, Brian ha un esempio di come fare questo usando sort-by

Oppure si può semplicemente implementare il proprio sort comparator

0

Non voglio ordinare (sebbene grazie per i suggerimenti di ordinamento), voglio solo specificare l'ordine quando estraggo i valori dalla mappa. Ho trovato un modo per farlo - destrutturando la mappa.

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