知识点: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核心知识点
- HashMap::new() 创建空哈希map;增删改需要 mut。
- map.insert(键, 值) :插入/覆盖一条记录。
- map.get(键) → 返回 Option<&V> ,配合 match 判断有无数据。
- 遍历 for (k,v) in &map :借用遍历,不会拿走所有权。
- entry(键).or_insert(默认值) :entry经典用法,键不存在才插入;存在就什么也不干。
- map.remove(键) :删除指定键‑值对。
- ⚠️HashMap 无序,输出顺序不固定,不要像数组一样依赖索引顺序!
对比 Python dict:HashMap ≈ Python 的字典(dict),功能非常接近。
完成!HashMap 基础过关,可以开启下一课。