Clojure Hashmaps Explained: Kuinka noutaa arvot ja päivittää Hashmaps

Hashmap on kokoelma, joka kartoittaa avaimet arvoihin. Heillä on useita nimiä muilla kielillä - Python viittaa niihin sanakirjoina, ja JavaScriptin objektit toimivat lähinnä hashmapsina.

Hashmap voidaan rakentaa, kuten monet kokoelmat, kahdella tavalla. Konstruktoritoiminto on:

;; 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}

Voit määrittää ne myös hashmap-kirjaimella. Tämä on usein ytimekkäämpää ja selkeämpää. Pilkkujen käyttäminen avain / arvo-parien erottamiseen hashmapsissa on suositeltavaa, koska se voi tehdä rajat selkeämmiksi.

;; 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}

Milloin hashmapia käytetään?

Hashmap on hyödyllinen, kun haluat antaa nimiä muuttujillesi. Jos ajattelet itsellesi: "Entä jos käyttäisin esinettä ...", ennen kuin napsautat sen irti ja huomaat käyttävänsi Clojurea, kokeile hashmapia.

Ne ovat hyödyllisiä myös, jos haluat liittää kaksi erilaista arvoa toisiinsa. Otetaan esimerkiksi ROT13-salaus - voit liittää \Asiihen \N, sen \Bkanssa \Mja niin edelleen.

Tämä olisi pitkä ja tylsä ​​kirjoittaa useimmilla kielillä, mutta Clojurella on joitain toimintoja, jotka voivat luoda sen sinulle ja tehdä siitä hauskaa!

Avainsanat ja arvojen noutaminen hashmapsista

Kestä. Mikä tämä on? :a? :b? :c? Ne näyttävät oudolta. Nämä ovat avainsanoja. Niitä kutsutaan avainsanoiksi, koska niitä käytetään usein avaimina hashmapsissa.

Miksi niitä käytetään usein avaimina? Toisin kuin merkkijonot, avainsanoja voidaan käyttää toimintoina arvojen poimimiseksi hashmapista; ei tarvita gettai 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!"

Päivitä hashmap

Voit päivittää hashmapin sisäiset arvot käyttämällä assoc. Tämän avulla voit liittää uusia avain / arvo-pareja tai muuttaa vanhoja.

(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}

Muiden kokoelmien muuntaminen hashmapsiksi

Muuntaminen hashmapiksi on hankalaa. Yritetään käyttää sitä kuten vectai seq.

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

hash-mapToiminto mielestä yritämme luoda HashMap kanssa [:a 1 :b 2 :c 3]kuin yksi avaimista. Katso mitä tapahtuu, jos annamme sille oikean määrän argumentteja:

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

Jos haluat muuntaa sekvenssin hashmapiksi, sinun on käytettävä ja ymmärrettävä apply. Onneksi tämä on melko yksinkertaista: applyolennaisesti tuhoaa kokoelman ennen funktion käyttämistä siihen.

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

Näin muunnat vektorin hashmapiksi:

(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}

Sen pitäisi olla kaikki mitä tarvitset aloittaaksesi hashmaps Clojuressa. Mene nyt sinne ja aloita sekoittuminen heidän parhaansa kanssa.