Capítulo 18: Coleções (HashMap) 📕Ϟ

Neste capítulo, vamos aprender a usar uma das estruturas de dados mais úteis do Rust: o HashMap (Tabela Hash), com o tema Pokédex!


📖 O que é um HashMap?

Diferente dos vetores onde acessamos os itens por um número (índice), no HashMap nós guardamos pares de Chave e Valor. Você pode usar um texto (como o nome de um Pokémon) como chave para encontrar um valor (como o tipo dele)!


📖 Exemplo Guiado: Criando uma Pokédex

Vamos criar um mapa para associar o nome do Pokémon ao seu tipo elemental.

  1. Crie o arquivo pokedex_hash.rs na pasta src/:
use std::collections::HashMap; // Precisamos importar o HashMap
 
fn main() {
    // Criando um HashMap vazio
    let mut pokedex = HashMap::new();
 
    // Adicionando itens (Chave -> Valor)
    pokedex.insert(String::from("Pikachu"), String::from("Eletrico"));
    pokedex.insert(String::from("Charmander"), String::from("Fogo"));
    pokedex.insert(String::from("Squirtle"), String::from("Agua"));
 
    // Buscando um valor pela chave
    let busca = "Pikachu";
    
    // O get retorna um Option (Some ou None)!
    match pokedex.get(busca) {
        Some(tipo) => println!("{} e do tipo: {}", busca, tipo),
        None => println!("{} nao encontrado na Pokedex.", busca),
    }
 
    println!("\n--- Todos os Pokemons ---");
    for (nome, tipo) in &pokedex {
        println!("{} -> {}", nome, tipo);
    }
}

🕹️ Como Executar e Testar no VS Code

  1. Abra le terminal integrado.
  2. Compile: rustc pokedex_hash.rs
  3. Execute: ./pokedex_hash

Resultado Esperado:

Pikachu e do tipo: Eletrico
 
--- Todos os Pokemons ---
Charmander -> Fogo
Squirtle -> Agua
Pikachu -> Eletrico

📊 Ilustração Visual: Chave e Valor

O HashMap conecta uma chave única diretamente ao seu valor:

graph LR
    A["'Pikachu'"] --> B["'Elétrico'"]
    C["'Charmander'"] --> D["'Fogo'"]
    E["'Squirtle'"] --> F["'Água'"]

🛠️ Prática Obrigatória 1: Loja de Itens de RPG

Crie um programa chamado loja_rpg.rs que use um HashMap para armazenar o nome de um item (String) e o seu preço em ouro (i32). Adicione pelo menos 3 itens (ex: “Espada”, “Escudo”, “Pocao”) e peça para o programa exibir o preço da “Espada” usando o método .get().


🔑 Gabarito de Código

Prática 1: loja_rpg.rs

use std::collections::HashMap;
 
fn main() {
    let mut loja = HashMap::new();
 
    loja.insert(String::from("Espada"), 150);
    loja.insert(String::from("Escudo"), 100);
    loja.insert(String::from("Pocao"), 50);
 
    let item_busca = "Espada";
 
    match loja.get(item_busca) {
        Some(preco) => println!("O item '{}' custa {} moedas de ouro.", item_busca, preco),
        None => println!("Item nao encontrado na loja."),
    }
}

Capitulo Anterior | Proximo Capitulo