【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 基础过关,可以开启下一课。

相关推荐
木子欢儿1 小时前
国内 macOS/Linux 安装 rust
linux·运维·服务器·macos·rust
白杨尚青1 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
橙橙笔记2 小时前
QT的学习第四部分
linux·qt·学习·音视频
.道阻且长.2 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言
叼烟扛炮2 小时前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习
Kapaseker2 小时前
Rust 一行 entry() 干掉五行 if/else
rust
在猴站学算法2 小时前
(《统计学习方法》(第2版) 李航)第2章 感知机算法
学习·算法·机器学习·统计学习
starzy19902 小时前
深入理解Scala匿名函数:函数式编程基石
开发语言·scala
旖旎夜光2 小时前
【C++ 基础入门】C++ 继承(上):概念、切片、隐藏、默认成员函数与友元
c++·笔记·学习
Godspeed Zhao2 小时前
从零开始学AI24——无监督学习之K均值
学习·机器学习