Menu
Coddy logo textTech

Aggiornare un valore

Fa parte della sezione Logica e flusso del percorso Rust di Coddy. Lezione 32 di 66.

A volte devi aggiornare i valori in una mappa hash in modi diversi. Hai già imparato che .insert() sovrascrive un valore esistente, ma cosa succede se vuoi aggiungere un valore solo quando la chiave non esiste già?

Rust fornisce l'API .entry() per aggiornamenti dei valori più sofisticati. Il metodo più utile in questa API è .or_insert(), che inserisce un valore solo se la chiave non è già presente:

let mut scores = HashMap::new();
scores.insert("Alice", 85);

// Questo NON sovrascriverà il punteggio di Alice
scores.entry("Alice").or_insert(90);

// Questo aggiungerà il punteggio di Bob, dato che Bob non è nella mappa
scores.entry("Bob").or_insert(90);

Il metodo .entry() restituisce un'enumerazione Entry che rappresenta una posizione occupata o libera nella mappa hash. Quando chiami .or_insert() su di essa, inserisce il nuovo valore solo se la voce è libera (la chiave non esiste).

challenge icon

Sfida

Facile

Riceverai un intero n che indica il numero di nomi di giocatori da elaborare. Poi riceverai n nomi di giocatori come input. Crea una mappa hash per tenere traccia dei punteggi dei giocatori (tipo HashMap<String, i32>). Per ogni nome di giocatore che ricevi, usa .entry() con .or_insert() per aggiungerlo alla mappa con un punteggio iniziale di 100 solo se non esiste già. Dopo aver elaborato tutti i nomi, stampa ogni giocatore e il suo punteggio.

Requisiti:

  • Importa HashMap da std::collections
  • Crea una mappa hash mutabile con tipo HashMap<String, i32>
  • Leggi il primo input e convertilo in i32 per ottenere il numero di nomi di giocatori
  • Usa un ciclo per leggere n nomi di giocatori
  • Per ogni nome di giocatore, usa .entry(name).or_insert(100) per aggiungerlo con un punteggio di 100 se non è già presente nella mappa
  • Dopo aver elaborato tutti i nomi, scorri la mappa hash e stampa le informazioni di ogni giocatore nel formato: [name]: [score]

Input:

  • Prima riga: un intero n (ad es., 5)
  • Le successive n righe: nomi di giocatori (ad es., Alice, Bob, Alice, Charlie, Bob)

Output:

  • Una riga per ogni giocatore univoco nel formato: [name]: [score]
  • L'ordine delle righe di output può variare tra le esecuzioni dei test

Provalo tu

use std::collections::HashMap;
use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // Leggi il numero di nomi dei giocatori
    let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
    
    // Crea una HashMap mutabile per memorizzare i punteggi dei giocatori
    let mut player_scores: HashMap<String, i32> = HashMap::new();
    
    // TODO: Scrivi il tuo codice qui sotto
    // Leggi n nomi di giocatori e usa .entry().or_insert(100) per aggiungerli alla mappa
    
    
    
    // Stampa ogni giocatore e il suo punteggio nel formato: [name]: [score]
    
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Rust online