Iterar sobre un Hash Map
Parte de la sección Logic & Flow del Journey de Rust de Coddy — lección 31 de 66.
A veces necesitas examinar cada par clave-valor en tu hash map, en lugar de buscar claves específicas. Rust proporciona una forma sencilla de recorrer todos los datos usando un bucle for:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}Observa el & antes de my_map: esto crea una referencia al hash map para que puedas iterar sin tomar la propiedad. El bucle te proporciona cada par clave-valor como una tupla que puedes desestructurar directamente en la declaración del bucle.
Aquí tienes un ejemplo práctico con una lista de precios:
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}Hay un detalle importante que recordar: los mapas hash no garantizan ningún orden de iteración específico. Los pares pueden aparecer en una secuencia diferente cada vez que ejecutes tu programa. Esto se debe a que los mapas hash priorizan las búsquedas rápidas sobre el mantenimiento del orden de inserción, así que no confíes en que los elementos aparezcan en ninguna secuencia particular cuando iteres.
Desafío
FácilRecibirás un entero n que indica el número de pares estudiante-calificación a procesar. Luego recibirás n pares de entradas: el nombre de un estudiante seguido de su calificación en el examen (como un entero). Crea un mapa hash para almacenar los nombres de los estudiantes como claves y sus calificaciones como valores. Después de insertar todos los pares, itera sobre el mapa hash e imprime el nombre y la calificación de cada estudiante.
Requisitos:
- Importa
HashMapdestd::collections - Crea un mapa hash mutable con los tipos
HashMap<String, i32> - Lee la primera entrada y conviértela a
i32para obtener el número de pares - Usa un bucle para leer
npares de entradas (nombre del estudiante, luego calificación) - Inserta cada nombre de estudiante y calificación en el mapa hash
- Usa un bucle
forpara iterar sobre el mapa hash con&map - Imprime la información de cada estudiante en el formato:
[name]: [score] - Imprime los pares en cualquier orden (los mapas hash no garantizan el orden)
Entrada:
- Primera línea: Un entero
n(por ejemplo,3) - Siguientes
npares de líneas:- Nombre del estudiante (por ejemplo,
Alice) - Calificación del examen como un entero (por ejemplo,
95)
- Nombre del estudiante (por ejemplo,
Salida:
- Una línea por cada estudiante en el formato:
[name]: [score] - El orden de las líneas de salida puede variar entre ejecuciones de prueba
Hoja de referencia
Para iterar sobre todos los pares clave-valor en un hash map, usa un bucle for con una referencia al mapa:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}El & antes del hash map crea una referencia, permitiendo la iteración sin tomar la propiedad (ownership). El bucle desestructura cada par clave-valor como una tupla.
Ejemplo con un hash map:
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}Importante: Los hash maps no garantizan ningún orden de iteración específico. Los pares pueden aparecer en diferentes secuencias cada vez que ejecutas tu programa, ya que los hash maps priorizan las búsquedas rápidas sobre el mantenimiento del orden de inserción.
Pruébalo tú mismo
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// Leer el número de pares estudiante-calificación
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Crear un mapa hash mutable para almacenar los nombres y calificaciones de los estudiantes
let mut students: HashMap<String, i32> = HashMap::new();
// TODO: Escribe tu código a continuación
// Leer n pares de entradas (nombre del estudiante y calificación) e insertarlos en el mapa hash
// TODO: Iterar sobre el mapa hash e imprimir el nombre y la calificación de cada estudiante
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Flujo de control avanzado
La expresión 'match'Coincidencia de múltiples valoresCoincidencia de rangosLa expresión 'if let'Bucles como expresionesResumen - Analizador de comandos simple4Agrupando datos con Structs
¿Qué es un Struct?Visión general de los StructsAcceso a los campos de un StructStructs mutablesStructs como parámetros de funcionesStructs de tuplaResumen - Crear un Struct de Libro7Manejo de errores con 'Result'
¿Qué es un 'Result'?Uso de 'match' con 'Result'is_ok() e is_err()Atajos: unwrap y expectEl operador de signo de interrogación '?'Parsing de Strings a númerosResumen - Función de división segura10Closures y funciones anónimas
¿Qué es un Closure?Definir un Closure simpleClosures con parámetrosCapturar el entornoResumen - Closure sumador simple2Introducción a los vectores
¿Qué es un vector?Crear un vectorAñadir elementos con pushAcceder a los elementos de un vectorIterar sobre un vectorIteración mutableEliminar elementosResumen: Rastreador de puntuación básico5Pares clave-valor con Hash Maps
¿Qué es un Hash Map?Crear un Hash MapInsertar pares clave-valorAcceder a los valoresIterar sobre un Hash MapActualizar un valorEliminar un parRepaso: Contador de palabras8Proyecto: Inventario simple de artículos
Configuración del proyectoAgregar un artículoVerificar el stockVender un artículoUniendo todo3Lista de tareas en la línea de comandos
Configuración del proyectoAñadir una tareaVer todas las tareasEliminar una tareaCódigo final