文章目录
- 哈希表(Hash map)
- 一、新建哈希表
- 二、访问某个元素
- 索引访问
- GET方法
- 二、插入新元素
- 三、遍历哈希表
- 四、检查某个元素是否存在
- contains_key方法
- entry方法
- 五、元素更新
- 使用contains_key+insert 的方法
- 使用entry方法
- 六、删除元素
Rus设计语言官方教程
哈希表(Hash map)
哈希表也是集合中的一种,也是最常用的集合形式,目前Rust语言核心部分没有对哈希表进行实现,是使用标准库提供的。
一、新建哈希表
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);println!("{:?}",scores); //{"Yellow": 50, "Blue": 10}
}
二、访问某个元素
索引访问
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);println!("value: {}",scores["Blue"]); // 10
}
GET方法
官方教程上的方法
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);let team_name = String::from("Blue");let score = scores.get(&team_name).copied().unwrap_or(0);println!("value: {}",score); // 10
}
以上两种方法都必须保证访问的元素存在,否则会报错
二、插入新元素
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);println!("{:?}",scores); //{"Yellow": 50, "Blue": 10}scores.insert(String::from("Red"), 100);println!("{:?}",scores);// {"Red": 100, "Yellow": 50, "Blue": 10}
}
这里可以看出,哈希表中的元素是没有顺序的
三、遍历哈希表
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);for (key, value) in &scores {println!("{key}: {value}");}
}=>
Yellow: 50
Blue: 10
四、检查某个元素是否存在
Rust语言中检查哈希表元素是否存在,有两种方法,
contains_key
方法和entry
- contains_key方法用于检查HashMap中是否包含特定的键。它返回一个布尔值,指示键是否存在。
- entry方法用于高效地处理键值对的插入和更新,它返回一个Entry枚举,可以是Occupied(键已存在)或Vacant(键不存在)。
contains_key方法
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);if scores.contains_key("Red"){println!("value :{}",scores["Red"]);}else {println!("Red is not found")}
}=>Red is not found
entry方法
entry方法多用于对值的更新,e
or_insert
方法在键对应的值存在时就返回这个值的可变引用,如果不存在则将参数作为新值插入并返回新值的可变引用
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);scores.entry(String::from("Red")).or_insert(100);scores.entry(String::from("Blue")).or_insert(50);println!("{:?}", scores);//{"Blue": 10, "Red": 100, "Yellow": 50}
}
五、元素更新
使用contains_key+insert 的方法
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);let team_list =["Blue","Red"];for i in team_list{if scores.contains_key(i){scores.insert(i.to_string(), scores[i]+50);}else{scores.insert(i.to_string(), 50);}}println!("{:?}",scores);//{"Red": 50, "Blue": 60, "Yellow": 50}
}
使用entry方法
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);let team_list =["Blue","Red"];for i in team_list{let count = scores.entry(i.to_string()).or_insert(0);*count += 50;}println!("{:?}",scores);//{"Red": 50, "Blue": 60, "Yellow": 50}
}
相比使用
contains_key+insert
的方法,这种方法更优雅。
六、删除元素
fn main() { use std::collections::HashMap;let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);scores.insert(String::from("Red"), 80);println!("{:?}",scores);//{"Blue": 10, "Yellow": 50, "Red": 80}scores.remove("Red");println!("{:?}",scores);//{"Blue": 10, "Yellow": 50}
}