【Rust入门知识点学与练】第11课:HashMap 键值对集合

知识点:HashMap --- 存储键值对

HashMap 需要先导入:

rust 复制代码
use std::collections::HashMap;

fn main() {
    // 创建空的 HashMap
    let mut scores: HashMap<String, i32> = HashMap::new();

    // 插入键值对
    scores.insert(String::from("小明"), 95);
    scores.insert(String::from("小红"), 88);
    scores.insert(String::from("小刚"), 72);
    println!("{:?}", scores);

    // 通过键访问值(返回 Option)
    match scores.get("小明") {
        Some(score) => println!("小明的分数: {}", score),
        None => println!("没找到"),
    }

    // 用方括号访问(键不存在会 panic,慎用)
    println!("小红的分数: {}", scores["小红"]);

    // 遍历所有键值对
    for (name, score) in &scores {
        println!("{}: {}分", name, score);
    }

    // 检查是否包含某个键
    println!("包含小刚? {}", scores.contains_key("小刚"));  // true

    // 删除键值对
    scores.remove("小刚");
    println!("删除后: {:?}", scores);

    // 更新值:如果键已存在则覆盖
    scores.insert(String::from("小明"), 100);
    println!("更新后小明: {}", scores["小明"]);

    // 用 entry API:只在键不存在时插入
    scores.entry(String::from("小李")).or_insert(60);
    println!("插入小李后: {:?}", scores);
}

核心规则

操作 写法

创建 HashMap::new()

插入 map.insert(key, value)

访问 map.get(&key) → Option<&V>

包含 map.contains_key(&key)

删除 map.remove(&key)

遍历 for (k, v) in &map { ... }

不存在才插入 map.entry(key).or_insert(value)

动手试试

补全下面的代码:

rust 复制代码
use std::collections::HashMap;

fn main() {
    // 补全:创建一个 HashMap,存储以下学生成绩
    // "语文" -> 85, "数学" -> 92, "英语" -> 78
    // 然后打印整个 HashMap
    // 期望输出: {"语文": 85, "数学": 92, "英语": 78}(顺序可能不同)

    // 补全:用 get 获取"数学"的成绩,用 match 打印
    // 期望输出: 数学成绩: 92

    // 补全:用 for 循环遍历 HashMap,计算所有科目的总分并打印
    // 期望输出: 总分: 255

    // 补全:用 entry API,如果"体育"不存在则插入 88
    // 打印整个 HashMap
    // 期望输出包含: "体育": 88

    // 补全:删除"英语",然后打印 HashMap
    // 期望输出: {"语文": 85, "数学": 92, "体育": 88}(顺序可能不同)
}

期望输出:

{"语文": 85, "数学": 92, "英语": 78}

数学成绩: 92

总分: 255

{"语文": 85, "数学": 92, "英语": 78, "体育": 88}

{"语文": 85, "数学": 92, "体育": 88}

写好了贴过来,没问题就进入第12课:结构体 Struct 👋

贴代码

rust 复制代码
  
use std::collections::HashMap;

fn main() {
    // 补全:创建一个 HashMap,存储以下学生成绩
    // "语文" -> 85, "数学" -> 92, "英语" -> 78
    // 然后打印整个 HashMap
    // 期望输出: {"语文": 85, "数学": 92, "英语": 78}(顺序可能不同)
    let mut scores = HashMap::new();
    scores.insert("语文", 85);
    scores.insert("数学", 92);
    scores.insert("英语", 78);
    println!("{:?}", scores);

    // 补全:用 get 获取"数学"的成绩,用 match 打印
    // 期望输出: 数学成绩: 92
    match scores.get("数学") {
        Some(v) => println!("数学成绩: {}", v),
        None => println!("没有数学成绩"),
    }

    // 补全:用 for 循环遍历 HashMap,计算所有科目的总分并打印
    // 期望输出: 总分: 255
    let mut total = 0;
    for (_subject, score) in &scores {
        total += score;
    }
    println!("总分: {}", total);

    // 补全:用 entry API,如果"体育"不存在则插入 88
    // 打印整个 HashMap
    // 期望输出包含: "体育": 88
    scores.entry("体育").or_insert(88);
    println!("{:?}", scores);

    // 补全:删除"英语",然后打印 HashMap
    // 期望输出: {"语文": 85, "数学": 92, "体育": 88}(顺序可能不同)
    scores.remove("英语");
    println!("{:?}", scores);
}
 

运行示例(HashMap无序,键的先后顺序每次运行不一定一样)

plaintext

{"语文": 85, "数学": 92, "英语": 78}

数学成绩: 92

总分: 255

{"语文": 85, "数学": 92, "英语": 78, "体育": 88}

{"语文": 85, "数学": 92, "体育": 88}

HashMap核心知识点

  1. HashMap::new() 创建空哈希map;增删改需要 mut。
  2. map.insert(键, 值) :插入/覆盖一条记录。
  3. map.get(键) → 返回 Option<&V> ,配合 match 判断有无数据。
  4. 遍历 for (k,v) in &map :借用遍历,不会拿走所有权。
  5. entry(键).or_insert(默认值) :entry经典用法,键不存在才插入;存在就什么也不干。
  6. map.remove(键) :删除指定键‑值对。
  7. ⚠️HashMap 无序,输出顺序不固定,不要像数组一样依赖索引顺序!

对比 Python dict:HashMap ≈ Python 的字典(dict),功能非常接近。

完成!HashMap 基础过关,可以开启下一课。

相关推荐
唐钰小宝B29 分钟前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows
2603_969579281 小时前
U盘的系统备份怎样还原系统?详细步骤与注意事项
学习
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
熊猫钓鱼>_>1 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
Meteors.1 小时前
Android Compose学习02:基础组件与 Modifier
android·学习
张张123y1 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
小陈不好吃2 小时前
Java 泛型与类型擦除:从 PECS 原则到 TypeToken 绕过
java·开发语言·windows·pecs 原则·typetoken绕过
Shaoshing2 小时前
存储引擎与架构
java·开发语言·架构
额额额对了2 小时前
Linux 驱动开发:基于 platform 总线 + misc 设备的 DS18B20 单总线温度驱动
linux·c语言·开发语言·驱动开发·嵌入式硬件
m4Rk_2 小时前
【论文阅读】Agent 记忆机制(102):UMA——用多个未来问题端到端训练一份共享记忆
论文阅读·人工智能·学习·开源·github