Menu
Coddy logo textTech

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).

challenge icon

Desafío

Fácil

Recibirá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 HashMap desde std::collections
  • Crea un mapa hash mutable con los tipos HashMap<String, i32>
  • Lee la primera entrada y conviértela a i32 para obtener el número de nombres de jugadores
  • Usa un bucle para leer n nombres de jugadores
  • Para cada nombre de jugador, usa .entry(name).or_insert(100) para agregarlos con una puntuación de 100 si 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 n lí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]
    
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Logic & Flow