更新值
本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 32 课,共 66 课。
有时,你需要用不同的方式更新哈希映射中的值。你已经学过,.insert() 会覆盖已有的值,但如果你只想在键不存在时才添加值,该怎么办?
Rust 提供了 .entry() API,用于更灵活地更新值。这个 API 中最有用的方法是 .or_insert(),它只会在键不存在时插入值:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// 这不会覆盖 Alice 的分数
scores.entry("Alice").or_insert(90);
// 由于 Bob 不在映射中,这会添加他的分数
scores.entry("Bob").or_insert(90);.entry() 方法会返回一个 Entry 枚举,用来表示哈希映射中的位置已占用或空闲。对它调用 .or_insert() 时,只有当条目空闲(键不存在)时,才会插入新值。
挑战
简单你会收到一个整数 n,表示要处理的玩家姓名数量。然后,你会收到 n 个玩家姓名作为输入。创建一个哈希映射来跟踪玩家分数(类型为 HashMap<String, i32>)。对于收到的每个玩家姓名,使用 .entry() 和 .or_insert() 将其添加到映射中,仅当该姓名尚不存在时,才将初始分数设为 100。处理完所有姓名后,打印每位玩家及其分数。
要求:
- 从
std::collections导入HashMap - 创建一个类型为
HashMap<String, i32>的可变哈希映射 - 读取第一个输入,并将其转换为
i32,以获取玩家姓名的数量 - 使用循环读取
n个玩家姓名 - 对于每个玩家姓名,使用
.entry(name).or_insert(100)将其添加到映射中,如果该姓名尚不存在,则将分数设为100 - 处理完所有姓名后,遍历哈希映射,并按以下格式打印每位玩家的信息:
[name]: [score]
输入:
- 第一行:一个整数
n(例如,5) - 接下来的
n行:玩家姓名(例如,Alice、Bob、Alice、Charlie、Bob)
输出:
- 每位不同的玩家占一行,格式为:
[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();
// 创建一个可变的 HashMap 来存储玩家分数
let mut player_scores: HashMap<String, i32> = HashMap::new();
// TODO: 在下方编写你的代码
// 读取 n 个玩家姓名,并使用 .entry().or_insert(100) 将它们添加到映射中
// 按以下格式输出每位玩家及其分数:[name]: [score]
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Rust 在线编译器