遍历哈希表
本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 31 课,共 66 课。
有时,你需要检查哈希映射中的每个键值对,而不是查找特定的键。Rust 提供了一种简单的方法,可以使用 for 循环遍历所有数据:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}注意 & 在 my_map 前面,这会创建一个指向哈希映射的引用,这样你就可以遍历它,而不必取得所有权。循环会将每个键值对作为元组提供给你,你可以直接在循环声明中对其进行解构。
下面通过一个价格列表的实用示例来说明:
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);
}有一个重要细节需要记住:哈希映射不保证任何特定的迭代顺序。每次运行程序时,键值对的顺序都可能不同。这是因为哈希映射优先考虑快速查找,而不是保持插入顺序,所以迭代时不要依赖项目按特定顺序出现。
挑战
简单你将收到一个整数 n,表示要处理的学生姓名和分数对的数量。接下来,你将收到 n 对输入:学生姓名,后跟他们的考试分数(整数)。创建一个哈希映射,将学生姓名作为键,分数作为值。插入所有数据对后,遍历哈希映射并打印每位学生的姓名和分数。
要求:
- 从
std::collections导入HashMap - 创建类型为
HashMap<String, i32>的可变哈希映射 - 读取第一个输入,并将其转换为
i32,以获取数据对的数量 - 使用循环读取
n对输入(先是学生姓名,然后是分数) - 将每位学生的姓名和分数插入哈希映射
- 使用
for循环,通过&map遍历哈希映射 - 按照以下格式打印每位学生的信息:
[name]: [score] - 可以按任意顺序打印这些数据对(哈希映射不保证顺序)
输入:
- 第一行:一个整数
n(例如,3) - 接下来的
n对行:- 学生姓名(例如,
Alice) - 整数形式的考试分数(例如,
95)
- 学生姓名(例如,
输出:
- 每位学生占一行,格式为:
[name]: [score] - 不同测试运行中,输出行的顺序可能会有所不同
亲手试试
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// 读取学生姓名和分数的配对数量
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// 创建一个可变哈希表,用于存储学生姓名和分数
let mut students: HashMap<String, i32> = HashMap::new();
// TODO:在下方编写你的代码
// 读取 n 组输入(学生姓名和分数),并将它们插入哈希表
// TODO:遍历哈希表,打印每个学生的姓名和分数
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Rust 在线编译器