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.
- Crie o arquivo
pokedex_hash.rsna pastasrc/:
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
- Abra le terminal integrado.
- Compile:
rustc pokedex_hash.rs - 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."),
}
}