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).
Défi
FacileVous 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
HashMapdepuisstd::collections - Créez une table de hachage mutable avec les types
HashMap<String, i32> - Lisez la première entrée et convertissez-la en
i32pour obtenir le nombre de noms de joueurs - Utilisez une boucle pour lire
nnoms de joueurs - Pour chaque nom de joueur, utilisez
.entry(name).or_insert(100)pour les ajouter avec un score de100s'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) nlignes 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]
}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
1Structures de contrôle avancées
L'expression 'match'Filtrage de plusieurs valeursFiltrage d'intervallesL'expression 'if let'Les boucles en tant qu'expressionsRécapitulatif - Analyseur de commandes simple4Regrouper des données avec les structures
Qu'est-ce qu'une structure ?Aperçu des structuresAccéder aux champs d'une structureStructures mutablesLes structures comme paramètres de fonctionStructures tupleRécapitulatif - Créer une structure Book2Introduction aux vecteurs
Qu'est-ce qu'un vecteur ?Créer un vecteurAjouter des éléments avec pushAccéder aux éléments d'un vecteurItérer sur un vecteurItération mutableSupprimer des élémentsRécapitulatif - Suivi de score basique5Paires clé-valeur avec les Hash Maps
Qu'est-ce qu'une Hash Map ?Créer une Hash MapInsérer des paires clé-valeurAccéder aux valeursParcourir une Hash MapMettre à jour une valeurSupprimer une paireRécapitulatif - Compteur de mots8Projet : Inventaire d'articles simple
Configuration du projetAjouter un articleVérifier le stockVendre un articleAssembler le tout3Liste de tâches en ligne de commande
Configuration du projetAjouter une tâcheAfficher toutes les tâchesSupprimer une tâcheCode final