Menu
Coddy logo textTech

Mettre à jour une valeur

Fait partie de la section Logic & Flow du Journey Rust de Coddy — leçon 32 sur 66.

Parfois, vous devez mettre à jour les valeurs d'une table de hachage de différentes manières. Vous avez déjà appris que .insert() écrasera une valeur existante, mais que se passe-t-il si vous voulez seulement ajouter une valeur lorsque la clé n'existe pas déjà ?

Rust fournit l'API .entry() pour des mises à jour de valeurs plus sophistiquées. La méthode la plus utile de cette API est .or_insert(), qui insère une valeur uniquement si la clé n'est pas déjà présente :

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

// Ceci n'écrasera PAS le score d'Alice
scores.entry("Alice").or_insert(90);

// Ceci AJOUTERA le score de Bob car il n'est pas dans la map
scores.entry("Bob").or_insert(90);

La méthode .entry() renvoie une énumération Entry qui représente soit un emplacement occupé, soit un emplacement vacant dans la table de hachage. Lorsque vous appelez .or_insert() dessus, elle n'insère la nouvelle valeur que si l'entrée est vacante (la clé n'existe pas).

challenge icon

Défi

Facile

Vous recevrez un entier n indiquant le nombre de noms de joueurs à traiter. Ensuite, vous recevrez n noms de joueurs en entrée. Créez une table de hachage pour suivre les scores des joueurs (type HashMap<String, i32>). Pour chaque nom de joueur reçu, utilisez .entry() avec .or_insert() pour les ajouter à la table avec un score initial de 100 uniquement s'ils n'existent pas déjà. Après avoir traité tous les noms, affichez chaque joueur et son score.

Exigences :

  • Importez HashMap depuis std::collections
  • Créez une table de hachage mutable avec les types HashMap<String, i32>
  • Lisez la première entrée et convertissez-la en i32 pour obtenir le nombre de noms de joueurs
  • Utilisez une boucle pour lire n noms de joueurs
  • Pour chaque nom de joueur, utilisez .entry(name).or_insert(100) pour les ajouter avec un score de 100 s'ils ne sont pas déjà dans la table
  • Après avoir traité tous les noms, itérez sur la table de hachage et affichez les informations de chaque joueur au format : [name]: [score]

Entrée :

  • Première ligne : Un entier n (par exemple, 5)
  • n lignes suivantes : Noms des joueurs (par exemple, Alice, Bob, Alice, Charlie, Bob)

Sortie :

  • Une ligne pour chaque joueur unique au format : [name]: [score]
  • L'ordre des lignes de sortie peut varier d'un test à l'autre

Aide-mémoire

L'API .entry() offre des moyens sophistiqués de mettre à jour les valeurs d'une table de hachage (hash map). La méthode .or_insert() insère une valeur uniquement si la clé n'existe pas déjà :

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

// Ceci ne va PAS écraser le score d'Alice
scores.entry("Alice").or_insert(90);

// Ceci VA ajouter le score de Bob car il n'est pas dans la table
scores.entry("Bob").or_insert(90);

La méthode .entry() renvoie une énumération Entry représentant soit un emplacement occupé, soit un emplacement vacant dans la table de hachage. Lorsque vous appelez .or_insert(), elle n'insère la nouvelle valeur que si l'entrée est vacante (la clé n'existe pas).

Essayez vous-même

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

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // Lire le nombre de noms de joueurs
    let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
    
    // Créer un HashMap mutable pour stocker les scores des joueurs
    let mut player_scores: HashMap<String, i32> = HashMap::new();
    
    // TODO: Écrivez votre code ci-dessous
    // Lire n noms de joueurs et utiliser .entry().or_insert(100) pour les ajouter à la map
    
    
    
    // Afficher chaque joueur et son score au format : [nom]: [score]
    
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logic & Flow