Parcourir une Hash Map
Fait partie de la section Logic & Flow du Journey Rust de Coddy — leçon 31 sur 66.
Parfois, vous devez examiner chaque paire clé-valeur de votre hash map, plutôt que de rechercher des clés spécifiques. Rust fournit un moyen simple de parcourir toutes les données à l'aide d'une boucle for :
for (key, value) in &my_map {
println!("{}: {}", key, value);
}Remarquez le & avant my_map - cela crée une référence à la hash map afin que vous puissiez itérer sans en prendre la propriété. La boucle vous donne chaque paire clé-valeur sous forme de tuple que vous pouvez déstructurer directement dans la déclaration de la boucle.
Voici un exemple pratique avec une liste de prix :
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}Il y a un détail important à retenir : les tables de hachage (hash maps) ne garantissent aucun ordre d'itération spécifique. Les paires peuvent apparaître dans un ordre différent à chaque fois que vous exécutez votre programme. C'est parce que les tables de hachage privilégient la rapidité des recherches par rapport au maintien de l'ordre d'insertion, ne comptez donc pas sur l'apparition des éléments dans une séquence particulière lorsque vous effectuez une itération.
Défi
FacileVous recevrez un entier n indiquant le nombre de paires étudiant-score à traiter. Ensuite, vous recevrez n paires d'entrées : un nom d'étudiant suivi de son score au test (sous forme d'entier). Créez une table de hachage (hash map) pour stocker les noms des étudiants comme clés et leurs scores comme valeurs. Après avoir inséré toutes les paires, parcourez la table de hachage et affichez le nom et le score de chaque étudiant.
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 paires - Utilisez une boucle pour lire
npaires d'entrées (nom de l'étudiant, puis score) - Insérez chaque nom d'étudiant et son score dans la table de hachage
- Utilisez une boucle
forpour itérer sur la table de hachage avec&map - Affichez les informations de chaque étudiant au format :
[name]: [score] - Affichez les paires dans n'importe quel ordre (les tables de hachage ne garantissent pas l'ordre)
Entrée :
- Première ligne : Un entier
n(par exemple,3) - Les
npaires de lignes suivantes :- Nom de l'étudiant (par exemple,
Alice) - Score au test sous forme d'entier (par exemple,
95)
- Nom de l'étudiant (par exemple,
Sortie :
- Une ligne pour chaque étudiant au format :
[name]: [score] - L'ordre des lignes de sortie peut varier d'un test à l'autre
Aide-mémoire
Pour itérer sur toutes les paires clé-valeur d'une table de hachage (hash map), utilisez une boucle for avec une référence à la table :
for (key, value) in &my_map {
println!("{}: {}", key, value);
}Le symbole & devant la table de hachage crée une référence, permettant l'itération sans en prendre la possession (ownership). La boucle déstructure chaque paire clé-valeur sous forme de tuple.
Exemple avec une table de hachage :
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}Important : Les tables de hachage ne garantissent aucun ordre d'itération spécifique. Les paires peuvent apparaître dans des séquences différentes à chaque exécution de votre programme, car les tables de hachage privilégient la rapidité des recherches plutôt que le maintien de l'ordre d'insertion.
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 paires étudiant-score
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Créer une table de hachage mutable pour stocker les noms et les scores des étudiants
let mut students: HashMap<String, i32> = HashMap::new();
// TODO: Écrivez votre code ci-dessous
// Lire n paires d'entrées (nom de l'étudiant et score) et les insérer dans la table de hachage
// TODO: Itérer sur la table de hachage et afficher le nom et le score de chaque étudiant
}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