Clojure Hashmaps expliqué: Comment récupérer des valeurs et mettre à jour des hashtmaps

Un hashmap est une collection qui mappe des clés à des valeurs. Ils ont différents noms dans d'autres langages - Python les appelle des dictionnaires, et les objets JavaScript fonctionnent essentiellement comme des hashmaps.

Un hashmap peut, comme de nombreuses collections, être construit de deux manières. Il y a la fonction constructeur:

;; Note that each argument is *prepended* to the hashmap, not appended. (def a-hashmap (hash-map :a 1 :b 2 :c 3)) a-hashmap ; => {:c 3, :b 2, :a 1}

Vous pouvez également les définir à l'aide d'un littéral hashmap. Ceci est souvent plus concis et clair. Il est recommandé d'utiliser des virgules pour séparer les paires clé / valeur dans les hashmaps, car cela peut rendre les limites plus claires.

;; This hashmap is actually in the right order, unlike the one above. (def another-hashmap {:a 1, :b 2, :c 3}) another-hashmap ; => {:a 1, :b 2, :c 3}

Quand utiliser un hashmap?

Un hashmap est utile lorsque vous souhaitez donner des noms à vos variables. Si jamais vous vous dites: «Et si j'utilisais un objet…» avant de vous en sortir et de réaliser que vous utilisez Clojure, essayez d'utiliser un hashmap.

Ils sont également utiles si vous souhaitez associer deux valeurs différentes entre elles. Prenez, par exemple, un chiffrement ROT13 - vous pouvez associer \Aavec \N, \Bavec \M, et ainsi de suite.

Ce serait long et ennuyeux à écrire dans la plupart des langues, mais Clojure a quelques fonctions qui peuvent le générer pour vous et le rendre amusant!

Mots-clés et récupération de valeurs à partir de hashmaps

Braquage. Qu'est-ce que c'est? :a? :b? :c? Celles-ci ont l'air bizarre. Ce sont des mots clés, voyez-vous. Ils sont appelés mots- clés car ils sont souvent utilisés comme clés dans les hashmaps.

Pourquoi sont-ils souvent utilisés comme clés? Eh bien, contrairement aux chaînes, les mots-clés peuvent être utilisés comme fonctions pour extraire des valeurs d'un hashmap; pas besoin de getou nth!

(def string-hashmap {"a" 1, "b" 2, "c" 3}) ("a" string-hashmap) ; => ClassCastException java.lang.String cannot be cast to clojure.lang.IFn (def keyword-hashmap {:a 1, :b 2, :c 3}) (:a keyword-hashmap) ; => 1 ;; You can also pass a keyword a default value in case it's not found, just like get. (:not-in-the-hashmap keyword-hashmap "not found!") ; => "not found!"

Mettre à jour un hashmap

Vous pouvez mettre à jour les valeurs dans un hashmap en utilisant assoc. Cela vous permet d'ajouter de nouvelles paires clé / valeur ou de modifier les anciennes.

(def outdated-hashmap {:a 1, :b 2, :c 3}) (def newer-hashmap (assoc outdated-hashmap :d 4)) newer-hashmap ; => {:a 1, :b 2, :c 3, :d 4} (def newest-hashmap (assoc newer-hashmap :a 22)) newest-hashmap ; => {:a 22, :b 2, :c 3, :d 4} ;; Note that outdated-hashmap has not been mutated by any of this. ;; Assoc is pure and functional. outdated-hashmap ; => {:a 1, :b 2, :c 3}

Conversion d'autres collections en hashmaps

La conversion en hashmap est délicate. Pour démontrer, essayons de l'utiliser comme vecou seq.

(hash-map [:a 1 :b 2 :c 3]) ; => IllegalArgumentException No value supplied for key: [:a 1 :b 2 :c 3]

La hash-mapfonction pense que nous essayons de créer un hashmap avec [:a 1 :b 2 :c 3]comme l'une des clés. Regardez ce qui se passe si nous lui donnons le bon nombre d'arguments:

(hash-map [:a 1 :b 2 :c 3] "foo") ; => {[:a 1 :b 2 :c 3] "foo"}

Pour convertir une séquence en hashmap, vous devrez utiliser et comprendre apply. Heureusement, c'est assez simple: applydéstructure essentiellement une collection avant de lui appliquer une fonction.

;; These two expressions are exactly the same. (+ 1 2 3) ; => 6 (apply + [1 2 3]) ; => 6

Voici comment convertir un vecteur en hashmap:

(apply hash-map [:a 1 :b 2 :c 3]) ; => {:c 3, :b 2, :a 1} ;; This is the same as: (hash-map :a 1 :b 2 :c 3) ; => {:c 3, :b 2, :a 1}

Cela devrait être tout ce dont vous avez besoin pour commencer avec les hashmaps dans Clojure. Maintenant, sortez et commencez à hacher avec les meilleurs d'entre eux.