2013-07-20 8 views
6

Sono sicuro che è facile, ma ho il sospetto che avrò un sacco di piccole domande sulla strada del clojure idematico. Forse mi sono perso qualcosa ma guardando la pagina della mappa del clojure, non ho trovato una soluzione.crea una mappa quando hai un vettore di chiavi e valori

Dato due vettori (uno di chiavi altro di valori) come si fa in modo efficiente (parola chiave!) Creare una mappa da chiave a valore?

le chiavi ei valori sono al di sotto:

(:year :month :day) (core/split "2013-02-18" #"-") 

risposta

16

La soluzione naturale è quella di utilizzare zipmap:

(zipmap [:year :month :day] (clojure.string/split "2013-02-18" #"-")) 
;= {:day "18", :month "02", :year "2013"} 

Per una piccola mappa come questa è in realtà piuttosto efficace. Per una mappa più grande, si desidera che zipmap utilizzi i transienti, che attualmente non è possibile. C'è un biglietto per questo in JIRA, con la mia patch allegata: CLJ-1005.

Ovviamente è abbastanza semplice includere il zipmap abilitato ai transienti nella propria base di codice e utilizzarlo preferibilmente a quello in clojure.core. Questa è una cosa abbastanza importante da fare se stai facendo zip su mappe più grandi.

Il codice può essere copiato dalla patch o dalla libreria di base ClojureScript, che utilizza transitori nella sua zipmap; qui un collegamento allo ClojureScript source a partire dalla versione 1844 (questa particolare funzione può essere utilizzata in Clojure senza modifiche).

+0

Ottima risposta, grazie. Clojure è uno scoppio fino ad ora, mi sento liberato dai visori della programmazione OO ... – Core

Problemi correlati