Tutorial de Armazenamento de Dados HashMap em Rust

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, aprendemos sobre o HashMap em Rust, que é usado para armazenar valores por chave. As chaves do HashMap podem ser de vários tipos, incluindo booleanos, inteiros, strings ou qualquer outro tipo que implemente os traits Eq e Hash. Os HashMaps podem crescer e encolher dinamicamente com base no número de elementos. Podemos criar um HashMap com uma capacidade específica usando HashMap::with_capacity(uint) ou usar HashMap::new() para obter um HashMap com uma capacidade inicial padrão. O exemplo de código fornecido demonstra o uso do HashMap armazenando nomes de contato e números de telefone e realizando operações como inserção, recuperação, modificação e remoção.

Nota: Se o laboratório não especificar um nome de arquivo, você pode usar qualquer nome de arquivo que desejar. Por exemplo, você pode usar main.rs, compilar e executar com rustc main.rs && ./main.

HashMap

Onde vetores armazenam valores por um índice inteiro, HashMaps armazenam valores por chave. As chaves do HashMap podem ser booleanos, inteiros, strings ou qualquer outro tipo que implemente os traits Eq e Hash. Mais detalhes sobre isso na próxima seção.

Assim como vetores, HashMaps são crescentes, mas também podem encolher quando têm espaço em excesso. Você pode criar um HashMap com uma determinada capacidade inicial usando HashMap::with_capacity(uint), ou usar HashMap::new() para obter um HashMap com uma capacidade inicial padrão (recomendado).

use std::collections::HashMap;

fn call(number: &str) -> &str {
    match number {
        "798-1364" => "Desculpe, a chamada não pode ser completada.
            Por favor, desligue e tente novamente.",
        "645-7689" => "Olá, aqui está a Pizzaria Sr. Awesome. Meu nome é Fred.
            O que posso fazer por você hoje?",
        _ => "Olá! Quem fala?"
    }
}

fn main() {
    let mut contacts = HashMap::new();

    contacts.insert("Daniel", "798-1364");
    contacts.insert("Ashley", "645-7689");
    contacts.insert("Katie", "435-8291");
    contacts.insert("Robert", "956-1745");

    // Recebe uma referência e retorna Option<&V>
    match contacts.get(&"Daniel") {
        Some(&number) => println!("Ligando para Daniel: {}", call(number)),
        _ => println!("Não temos o número do Daniel."),
    }

    // `HashMap::insert()` retorna `None`
    // se o valor inserido for novo, `Some(value)` caso contrário
    contacts.insert("Daniel", "164-6743");

    match contacts.get(&"Ashley") {
        Some(&number) => println!("Ligando para Ashley: {}", call(number)),
        _ => println!("Não temos o número da Ashley."),
    }

    contacts.remove(&"Ashley");

    // `HashMap::iter()` retorna um iterador que gera pares (&'a chave, &'a valor) em uma ordem arbitrária.
    for (contact, &number) in contacts.iter() {
        println!("Ligando para {}: {}", contact, call(number));
    }
}

Para mais informações sobre como funcionam os hash e os hash maps (às vezes chamados de tabelas hash), consulte a Wikipedia de Tabela Hash.

Resumo

Parabéns! Você concluiu o laboratório de HashMap. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.