2010-12-01 41 views

Répondre

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

Notez que cela fonctionne également pour les tableaux de tableaux à deux éléments - il suffit d'ajouter un '(map vec ...)' autour de l'argument du tableau: '(dans {} (map vec an-array-of -two-element-arrays)). –

+0

Et encore une fois, un de ces moments "duh" que vous avez si souvent en utilisant Clojure. Bonne réponse. – Isaac

+0

Mais un relativement cher. – kotarak

5

En supposant que "tupel" signifie "matrice à deux elememt":

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

Nice. Si votre (à l'OP) "array" est en fait un seq, au lieu de '(aget t n)' vous pouvez utiliser '(t n)', ce qui est un peu plus joli. – Isaac

+0

'(t n)' ne fonctionne pas avec les séquences. Il le fait avec des vecteurs. Mais alors vous pouvez simplement utiliser '(dans {} array-of-vectors)' au lieu de 'reduce'. – kotarak

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

'flatten' est trop compliqué pour ce problème. Vous pouvez profiter des tuples sous la forme d'un MapEntry (vecteur de clé et de valeur). – miner49r

+1

N'utilisez jamais 'flatten' pour une situation comme celle-ci: elle aplatira heureusement toutes vos clés et valeurs si elles sont des structures de données! –

5

Une carte est une séquence d'éléments MapEntry. Chaque MapEntry est un vecteur d'une clé et d'une valeur. Les tuples dans la question sont déjà sous la forme d'un MapEntry, ce qui rend les choses pratiques. (C'est aussi pourquoi la solution into est bonne.)

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

Merci pour la bonne explication! Donc seul le vecteur de 2 éléments est MapEntry, ainsi (dans {} [[: a 1] {: b 2}]) fonctionnera, mais (dans {} ['(:: 1) {: b 2}]) ne fonctionne pas.Il obtient l'erreur de "java.lang.ClassCastException: clojure.lang.Keyword ne peut pas être converti en java.util.Map $ Entry". Je me demande pourquoi Clojure ne peut pas traiter tous les 2 éléments de la même manière dans ce contexte. Cela le rendra plus cohérent. Quelle est la raison pour laquelle ça ne fonctionne pas? –