删除键值对
本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 33 课,共 66 课。
有时,你需要从哈希映射中彻底删除数据。Rust 提供了 .remove() 方法,你可以指定键来删除键值对:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
// 彻底删除 "apples" 条目
inventory.remove("apples");.remove() 方法将键作为参数,并从哈希映射中删除该键及其关联的值。调用 .remove("apples") 后,再尝试查找 "apples" 会返回 None。
和许多哈希映射操作一样,.remove() 会返回一个 Option。如果键存在,它会返回包含被移除值的 Some(value);如果找不到键,则返回 None:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}这个返回值可以让你知道移除是否成功,并让你获取被移除的值,这对日志记录或清理操作很有用。
挑战
简单你会收到一个整数 n,表示库存中的物品数量。然后你会收到 n 对输入:每对先是物品名称,再是数量(整数)。之后,你还会收到一个输入,其中包含要从库存中移除的物品名称。创建一个哈希映射来存储库存,插入所有物品,移除指定物品,并打印移除结果以及剩余库存。
要求:
- 从
std::collections导入HashMap - 创建一个类型为
HashMap<String, i32>的可变哈希映射 - 读取第一个输入,并将其转换为
i32,以获取物品数量 - 使用循环读取
n对输入(先是物品名称,然后是数量) - 将每件物品及其数量插入哈希映射
- 再读取一个输入,作为要移除的物品名称
- 使用
.remove()从哈希映射中移除物品 - 使用
match处理.remove()返回的Option - 如果找到并移除了该物品,打印:
Removed [quantity] [item_name] - 如果未找到该物品,打印:
[item_name] not found - 处理完移除操作后,遍历剩余的哈希映射,并按照以下格式打印每件物品:
[item_name]: [quantity]
输入:
- 第一行:一个整数
n(例如,3) - 接下来的
n对行:- 物品名称(例如,
apples) - 作为整数的数量(例如,
50)
- 物品名称(例如,
- 最后一行:要移除的物品名称(例如,
bananas)
输出:
- 第一行:
Removed [quantity] [item_name]或[item_name] not found - 接下来的每一行:按照以下格式输出一件剩余物品:
[item_name]: [quantity] - 不同测试运行中,剩余物品的顺序可能不同
亲手试试
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 inventory: HashMap<String, i32> = HashMap::new();
// 读取 n 组输入(商品名称和数量)
for _ in 0..n {
let item_name = lines.next().unwrap().unwrap().trim().to_string();
let quantity: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// TODO: 将商品及其数量插入哈希映射
}
// 读取要移除的商品名称
let item_to_remove = lines.next().unwrap().unwrap().trim().to_string();
// TODO: 从哈希映射中移除商品,并使用 match 处理结果
// 输出移除结果("Removed [quantity] [item_name]" 或 "[item_name] not found")
// TODO: 遍历剩余库存,按 "[item_name]: [quantity]" 的格式输出每件商品
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Rust 在线编译器