Tutorial de almacenamiento de datos HashMap en Rust

Beginner

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

Introducción

En este laboratorio, aprendemos sobre HashMap en Rust, que se utiliza para almacenar valores por clave. Las claves de HashMap pueden ser de varios tipos, incluyendo booleanos, enteros, cadenas o cualquier otro tipo que implemente los rasgos Eq y Hash. Los HashMaps pueden crecer y contraerse dinámicamente en función del número de elementos. Podemos crear un HashMap con una capacidad específica utilizando HashMap::with_capacity(uint) o utilizar HashMap::new() para obtener un HashMap con una capacidad inicial predeterminada. El ejemplo de código proporcionado demuestra el uso de HashMap al almacenar nombres y números de teléfono de contactos y realizar operaciones como inserción, recuperación, modificación y eliminación.

Nota: Si el laboratorio no especifica un nombre de archivo, puede utilizar cualquier nombre de archivo que desee. Por ejemplo, puede utilizar main.rs, compilar y ejecutarlo con rustc main.rs &&./main.

HashMap

Mientras que los vectores almacenan valores mediante un índice entero, los HashMap almacenan valores por clave. Las claves de HashMap pueden ser booleanos, enteros, cadenas o cualquier otro tipo que implemente los rasgos Eq y Hash. Más sobre esto en la siguiente sección.

Como los vectores, los HashMap son crecibles, pero los HashMap también pueden contraerse a sí mismos cuando tienen espacio sobrante. Puedes crear un HashMap con una capacidad inicial determinada utilizando HashMap::with_capacity(uint), o utilizar HashMap::new() para obtener un HashMap con una capacidad inicial predeterminada (recomendado).

use std::collections::HashMap;

fn call(number: &str) -> &str {
    match number {
        "798-1364" => "Lo sentimos, la llamada no se puede completar con el número marcado.
            Por favor cuelgue y vuelva a intentarlo.",
        "645-7689" => "Hola, esta es la pizzería de Sr. Genial. Me llamo Fred.
            ¿En qué puedo ayudarte hoy?",
        _ => "¡Hola! ¿Quién es esta vez?"
    }
}

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");

    // Toma una referencia y devuelve Option<&V>
    match contacts.get(&"Daniel") {
        Some(&number) => println!("Llamando a Daniel: {}", call(number)),
        _ => println!("No tengo el número de Daniel."),
    }

    // `HashMap::insert()` devuelve `None`
    // si el valor insertado es nuevo, `Some(value)` en caso contrario
    contacts.insert("Daniel", "164-6743");

    match contacts.get(&"Ashley") {
        Some(&number) => println!("Llamando a Ashley: {}", call(number)),
        _ => println!("No tengo el número de Ashley."),
    }

    contacts.remove(&"Ashley");

    // `HashMap::iter()` devuelve un iterador que produce
    // pares (&'a key, &'a value) en un orden arbitrario.
    for (contact, &number) in contacts.iter() {
        println!("Llamando a {}: {}", contact, call(number));
    }
}

Para obtener más información sobre cómo funcionan los algoritmos de hash y las tablas hash (a veces llamadas tablas hash), echa un vistazo a Tabla hash en Wikipedia

Resumen

¡Felicitaciones! Has completado el laboratorio de HashMap. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.