Menu
CoddyTech

删除键值对

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

这个返回值可以让你知道移除是否成功,并让你获取被移除的值,这对日志记录或清理操作很有用。

challenge icon

挑战

简单

你会收到一个整数 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]" 的格式输出每件商品
}
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Rust 在线编译器