Actualizar un valor
Parte de la sección Logic & Flow del Journey de Rust de Coddy — lección 32 de 66.
A veces necesitas actualizar valores en un hash map de diferentes maneras. Ya has aprendido que .insert() sobrescribirá un valor existente, pero ¿qué pasa si solo quieres añadir un valor cuando la clave aún no existe?
Rust proporciona la API .entry() para actualizaciones de valores más sofisticadas. El método más útil en esta API es .or_insert(), que solo inserta un valor si la clave aún no está presente:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// Esto NO sobrescribirá la puntuación de Alice
scores.entry("Alice").or_insert(90);
// Esto SÍ añadirá la puntuación de Bob ya que no está en el mapa
scores.entry("Bob").or_insert(90);El método .entry() devuelve un enum Entry que representa un lugar ocupado o vacío en el mapa hash. Cuando llamas a .or_insert() en él, solo inserta el nuevo valor si la entrada está vacía (la clave no existe).
Desafío
FácilRecibirás un entero n que indica el número de nombres de jugadores a procesar. Luego recibirás n nombres de jugadores como entradas. Crea un mapa hash para rastrear las puntuaciones de los jugadores (tipo HashMap<String, i32>). Para cada nombre de jugador que recibas, usa .entry() con .or_insert() para agregarlos al mapa con una puntuación inicial de 100 solo si aún no existen. Después de procesar todos los nombres, imprime cada jugador y su puntuación.
Requerimientos:
- Importa
HashMapdesdestd::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 nombres de jugadores - Usa un bucle para leer
nnombres de jugadores - Para cada nombre de jugador, usa
.entry(name).or_insert(100)para agregarlos con una puntuación de100si aún no están en el mapa - Después de procesar todos los nombres, itera sobre el mapa hash e imprime la información de cada jugador en el formato:
[name]: [score]
Entrada:
- Primera línea: Un entero
n(por ejemplo,5) - Siguientes
nlíneas: Nombres de jugadores (por ejemplo,Alice,Bob,Alice,Charlie,Bob)
Salida:
- Una línea por cada jugador único en el formato:
[name]: [score] - El orden de las líneas de salida puede variar entre las ejecuciones de prueba
Hoja de referencia
La API .entry() proporciona formas sofisticadas de actualizar los valores de un mapa hash. El método .or_insert() solo inserta un valor si la clave aún no existe:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// This will NOT overwrite Alice's score
scores.entry("Alice").or_insert(90);
// This WILL add Bob's score since he's not in the map
scores.entry("Bob").or_insert(90);El método .entry() devuelve un enum Entry que representa un lugar ocupado o vacante en el mapa hash. Cuando llamas a .or_insert(), solo inserta el nuevo valor si la entrada está vacante (la clave no existe).
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 nombres de jugadores
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Crear un HashMap mutable para almacenar las puntuaciones de los jugadores
let mut player_scores: HashMap<String, i32> = HashMap::new();
// TODO: Escribe tu código a continuación
// Leer n nombres de jugadores y usar .entry().or_insert(100) para añadirlos al mapa
// Imprimir cada jugador y su puntuación en el formato: [nombre]: [puntuación]
}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