freeCodeCamp/guide/portuguese/clojure/hashmaps/index.md

4.7 KiB
Raw Blame History

title localeTitle
Clojure Hashmaps Clojure Hashmaps

Um hashmap é uma coleção que mapeia chaves para valores. Eles têm vários nomes em outros idiomas; O Python se refere a eles como dicionários, e os objetos JavaScript funcionam essencialmente como hashmaps.

Um hashmap pode, como muitas coleções, ser construído de duas maneiras. Existe a função construtora:

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

Você também pode defini-los usando um literal de hashmap. Isso geralmente é mais conciso e claro. É recomendável usar vírgulas para separar pares chave / valor em hashmaps, pois isso pode tornar os limites mais claros.

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

Palavras-chave e recuperar valores de hashmaps

Aguarde. O que é isso? :a :b ? :c ? Aqueles parecem estranhos. Essas, você vê, são palavras-chave. Eles são chamados de palavras- chave porque são usados com frequência como chaves em hashmaps.

Por que eles são freqüentemente usados como chaves? Bem, ao contrário das strings, as palavras-chave podem ser usadas como funções para extrair valores de um hashmap; Não há necessidade de get ou 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!" 

Convertendo outras coleções para hashmaps

A conversão para um hashmap é complicada. Para demonstrar, vamos tentar usá-lo como vec ou seq .

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

A função hash-map pensa que estamos tentando criar um hashmap com [:a 1 :b 2 :c 3] como uma das chaves. Veja o que acontece se dermos o número correto de argumentos:

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

Para converter uma sequência em um hashmap, você precisará usar e entender apply . Felizmente, isso é bem simples: apply essencialmente uma coleção de destrutivos antes de aplicar uma função a ela.

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

É assim que você converteria um vetor em um 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} 

:rocket: IDEOne isso!

Atualizar um hashmap

Você pode atualizar valores dentro de um hashmap usando assoc . Isso permite que você anexe novos pares de chave / valor ou altere os antigos.

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

Quando usar um hashmap?

Um hashmap é útil quando você quer dar nomes às suas variáveis. Se você já pensou em si mesmo: "E se eu usasse um objeto ..." antes de sair dessa e perceber que está usando o Clojure, tente usar um hashmap.

Eles também são úteis se você deseja associar dois valores diferentes entre si. Tomemos, por exemplo, uma cifra ROT13: você poderia associar \A com \N , \B com \M , etc. (Isso seria longo e chato de escrever na maioria das linguagens, mas o Clojure tem algumas funções que podem gerá-lo para você e torná-lo divertido! )

| :point_left: Anterior | :book: Casa :book: | Próximo :point_right: |
| Vetores | Índice | Ser adicionado |