Menu
CoddyTech

更新值

本课属于 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() 时,只有当条目空闲(键不存在)时,才会插入新值。

challenge icon

挑战

简单

你会收到一个整数 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]
    
}
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Rust 在线编译器