Објашњени хешмапе Цлојуре: Како доћи до вредности и ажурирати хешмапе

Хешмапа је колекција која пресликава кључеве у вредности. Имају различита имена на другим језицима - Питхон их назива речницима, а ЈаваСцрипт објекти у основи раде попут хешмапа.

Хешмапа се, као и многе колекције, може конструисати на два начина. Постоји функција конструктора:

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

Можете их дефинисати и помоћу хасхмап литерала. Ово је често сажетије и јасније. Препоручује се коришћење зареза за одвајање парова кључ / вредност у хешмапама, јер то границе може учинити јаснијим.

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

Када користити хасхмап?

Хешмапа је корисна када желите дати имена променљивим. Ако икада помислите у себи: „Шта ако бих користио објекат ...“ пре него што искочите из њега и схватите да користите Цлојуре, покушајте да употребите хеш-мапу.

Такође су корисне ако желите да међусобно повежете две различите вредности. Узмимо, на пример, на РОТ13 шифру - можете придружити \Aса \N, \Bса \M, и тако даље.

Ово би било дуго и досадно писати на већини језика, али Цлојуре има неке функције које га могу створити за вас и учинити га забавним!

Кључне речи и преузимање вредности из хешмапа

Држати. Шта је ово? :a? :b? :c? Изгледају чудно. То су, видите, кључне речи. Они се називају кључним речима, јер се често користе као кључеви у хешмапима.

Зашто се често користе као кључеви? Па, за разлику од низова, кључне речи се могу користити као функције за издвајање вредности из хеш-мапе; Нема потребе за getили 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!"

Ажурирајте хасхмап

Можете да ажурирате вредности унутар хеш-мапе помоћу assoc. Ово вам омогућава додавање нових парова кључ / вредност или мењање старих.

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

Претварање осталих колекција у хеш-мапове

Претварање у хасхмап је незгодно. Да бисмо демонстрирали, покушајмо да га користимо као vecили seq.

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

hash-mapФункција сматра да покушавамо да створимо ХасхМап са [:a 1 :b 2 :c 3]као један од тастера. Пазите шта се догађа ако му дамо тачан број аргумената:

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

Да бисте претворили секвенцу у хеш-мапу, мораћете да је користите и разумете apply. Срећом, ово је прилично једноставно: у applyоснови деструктуира колекцију пре него што на њу примените функцију.

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

Ево како бисте претворили вектор у хеш-мапу:

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

То би требало да буде све што вам је потребно да бисте започели са хеш-мапама у Цлојуре-у. Сада изађите тамо и почните са хеширањем са најбољим од њих.