Da trilha de Rust Este conceito ainda não saiu como card do dia. ir para o card de hoje

Rust Coleções Intermediário

Vec e HashMap

Em Rust, as coleções mais usadas do dia a dia são Vec<T> e HashMap<K, V>. O Vec é uma lista dinâmica que guarda elementos de um mesmo tipo em sequência, permitindo acesso rápido por índice e crescimento automático. Já o HashMap armazena pares chave-valor, oferecendo busca média em tempo constante — ideal para contar, agrupar ou indexar dados por uma chave.

Ambos vivem na heap e são genéricos: você escolhe o tipo dos elementos. Para criar, use Vec::new() ou a macro vec![], e HashMap::new(). A inserção no Vec é feita com push, e no HashMap com insert. A grande estrela do HashMap é a entry API: map.entry(chave).or_insert(valor) insere um valor padrão se a chave não existir e devolve uma referência mutável ao valor, tudo em uma única operação.

Iterar é onde as coleções brilham. Com for você percorre &vec (emprestando), &mut vec (modificando) ou vec (consumindo). No HashMap, a iteração devolve tuplas (&K, &V), e você pode usar .iter(), .keys() ou .values(). Combinar entry com iteração é a base de padrões como contagem de frequência e agrupamento.

Neste card, vamos praticar a criação, inserção, busca e iteração com Vec e HashMap, sempre usando a entry API para evitar buscas duplicadas.

Pontos-chave

  • Vec<T> é uma lista dinâmica; HashMap<K, V> associa chaves a valores.
  • Use vec![] para criar vetores e HashMap::new() para mapas.
  • A entry API (entry(k).or_insert(v)) insere se não existir e devolve &mut V.
  • Itere com for x in &vec ou for (k, v) in &map para não consumir a coleção.
  • HashMap não garante ordem; para ordenar, colete em Vec e use sort.
colecoes.rs
use std::collections::HashMap;

fn main() {
    // Vec: lista dinâmica de notas
    let mut notas = vec![8, 6, 9, 7, 10];
    notas.push(5); // adiciona no fim

    let soma: i32 = notas.iter().sum();
    let media = soma as f64 / notas.len() as f64;
    println!("Notas: {:?}", notas);
    println!("Média: {:.2}", media);

    // HashMap: contagem de frequência com entry API
    let palavras = vec!["rust", "vec", "rust", "hashmap", "vec", "rust"];
    let mut contagem: HashMap<&str, u32> = HashMap::new();

    for p in &palavras {
        // se a chave não existe, insere 0; depois soma 1
        *contagem.entry(*p).or_insert(0) += 1;
    }

    // Iteração sobre o HashMap (ordem não garantida)
    for (palavra, qtd) in &contagem {
        println!("{}: {}", palavra, qtd);
    }

    // Busca segura com get
    if let Some(qtd) = contagem.get("rust") {
        println!("A palavra 'rust' aparece {} vezes", qtd);
    }
}

Exercícios

  1. 1
    Fácil

    Soma e média de um Vec

    Crie um Vec<i32> com os valores [4, 7, 10, 3, 8]. Calcule e imprima a soma e a média (como f64).

    Resolver
  2. 2
    Médio

    Contagem de frequência com entry API

    Dada a frase "a b a c b a", conte quantas vezes cada palavra aparece usando um HashMap e a entry API. Imprima cada palavra e sua contagem em ordem alfabética.

    Resolver
  3. 3
    Desafio

    Agrupamento de notas por aluno

    Dada uma lista de tuplas (nome, nota), agrupe as notas de cada aluno em um HashMap<String, Vec<i32>> usando a entry API. Depois, para cada aluno, calcule a média e imprima os alunos em ordem alfabética, mostrando as notas e a média com duas casas decimais.

    Resolver

Continue estudando