2010-12-01 13 views

Respuesta

47
user=> (into {} [[:a 1] [:b 2]]) 
{:a 1, :b 2} 
+0

Tenga en cuenta que esto también funciona para matrices de matrices de dos elementos; solo tendría que agregar un '(map vec ...)' alrededor del argumento de la matriz: '(into {} (map vec an-array-of -dos elementos de matrices)) '. –

+0

Y otra vez, uno de esos momentos "duh" que tan a menudo tiene mientras usa Clojure. Buena respuesta. – Isaac

+0

Pero es relativamente caro. – kotarak

5

Suponiendo que "tupel" significa "matriz de dos elememt":

(reduce 
    (fn [m tupel] 
     (assoc m 
      (aget tupel 0) 
      (aget tupel 1))) 
    {} 
    array-of-tupels)
+0

Nice. Si tu (a la OP) "matriz" es de hecho una secuencia, en lugar de '(aget t n)' puedes usar '(t n)', que es un poco más bonita. – Isaac

+0

'(t n)' no funciona con secuencias. Lo hace con vectores. Pero luego puedes simplemente usar '(into {} array-of-vectors)' en lugar de 'reduce'. – kotarak

4
user=> (def a [[:a 4] [:b 6]]) 
user=> (apply hash-map (flatten a)) 
{:a 4, :b 6} 
+2

'flatten' es excesivo para este problema. Puede aprovechar las tuplas en forma de MapEntry (vector de clave y valor). – miner49r

+1

Nunca, nunca use 'aplanar' para una situación como esta: ¡felizmente aplanará todas sus llaves y valores también, si resultan ser estructuras de datos! –

5

un mapa es una secuencia de elementos MapEntry. Cada MapEntry es un vector de una clave y un valor. Las tuplas en la pregunta ya están en forma de MapEntry, lo que hace las cosas más convenientes. (Esa es también la razón por la cual la solución into es buena).

user=> (reduce conj {} [[:a 1] [:b 2]]) 
{:b 2, :a 1} 
+2

¡Gracias por una buena explicación! Entonces, solo el vector de 2 elementos es MapEntry, así (en {} [[: a 1] {: b 2}]) funcionará, pero (en {} ['(: a 1) {: b 2}]) no funciona. Obtiene el error de "java.lang.ClassCastException: clojure.lang.Keyword no se puede convertir a java.util.Map $ Entry". Me pregunto por qué Clojure no puede tratar la secuencia de los 2 elementos de la misma manera en este contexto. Lo hará más consistente. ¿Cuál es la razón por la que no? –

Cuestiones relacionadas