J'ai un tableau de tuples, où chaque tuple est un 2 tuple avec une clé et une valeur. Quel serait le moyen le plus propre de convertir ce tableau de tuples en une table de hachage?Convertir un tableau de tuples en une table de hachage dans Clojure
Répondre
user=> (into {} [[:a 1] [:b 2]])
{:a 1, :b 2}
En supposant que "tupel" signifie "matrice à deux elememt":
(reduce
(fn [m tupel]
(assoc m
(aget tupel 0)
(aget tupel 1)))
{}
array-of-tupels)
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
'(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
user=> (def a [[:a 4] [:b 6]])
user=> (apply hash-map (flatten a))
{:a 4, :b 6}
'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
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! –
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}
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? –
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)). –
Et encore une fois, un de ces moments "duh" que vous avez si souvent en utilisant Clojure. Bonne réponse. – Isaac
Mais un relativement cher. – kotarak