Menu
CoddyTech

遍历哈希表

本课属于 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);
}

有一个重要细节需要记住:哈希映射不保证任何特定的迭代顺序。每次运行程序时,键值对的顺序都可能不同。这是因为哈希映射优先考虑快速查找,而不是保持插入顺序,所以迭代时不要依赖项目按特定顺序出现。

challenge icon

挑战

简单

你将收到一个整数 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:遍历哈希表,打印每个学生的姓名和分数
    
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Rust 在线编译器