《快速入手Rust》14.HashMap和其他集合
HashMap和其他集合
HashMap是由keys和values组成的集合。你使用键来查找与键匹配的值。你可以只用HashMap::new()
创建一个新的HashMap,并使用.insert(key, value)
来插入元素。
可以通过get
方法来获取到对应的值,它会返回一个Option
,如果存在则返回Some(value)
,如果不存在则返回None
。entry
来检查键是否绑定了一个值,结合or_insert
如果只有键,没有对应的值则插入。这个键可以不存在也可以没有相关联的值。
我们可以根据一个旧值来更新一个值,or_insert
方法会返回这个键对应的值是一个可变引用,我们更新它的值先将它解引用,进行更新
示例代码:
use std::collections::HashMap;
fn main() {
let mut collections = HashMap::new();
collections.insert(1, "Beijing".to_string());
collections.insert(2, "Shanghai".to_string());
collections.insert(3, "Hangzhou".to_string());
println!("{:?}", collections);
//HashMap里面的值是无序的,同时打印它们多次打印出现的顺序可能都不同
//{2: "Shanghai", 3: "Hangzhou", 1: "Beijing"}
//{3: "Hangzhou", 1: "Beijing", 2: "Shanghai"}
//如果HashMap有一个键,我们将它放进去时,它会覆盖原来的值
collections.insert(1, "Nanjing".to_string());
println!("{:?}", collections);
//{1: "Nanjing", 3: "Hangzhou", 2: "Shanghai"}
collections.entry(1).or_insert("Chongqing".to_string()); //有值不插入
println!("{:?}", collections);
collections.entry(4).or_insert("Sanya".to_string());
println!("{:?}", collections);
let text = "hello world wonderful world";
let mut map = HashMap::new();
for word in text.split_whitespace() {
let count = map.entry(word).or_insert(0);
*count += 1;
}
println!("map is {:?}", map);
let a = collections.get(&1);
println!("a is {:?}", a);
}
其他集合
BTreeMap 和 HashMap 的区别是它是有序的,而HashMap是无序的。
use std::collections::BTreeMap;
fn main() {
//将HashMap替换成BTreeMap
let mut collections = BTreeMap::new();
collections.insert(1, "Beijing".to_string());
collections.insert(2, "Shanghai".to_string());
collections.insert(3, "Hangzhou".to_string());
println!("{:?}", collections);
// 打印结果 BTreeMap会按顺序打印
// {1: "Beijing", 2: "Shanghai", 3: "Hangzhou"}
}
HashSet和BTreeSet
HashSet实际上是只有key
的HashMap,同理BtreeSet。 它有键没有值。
use std::collections::HashSet;
fn main() {
let mut map = HashSet::new();
let v = vec![ 94, 42, 59, 64, 32, 22, 38, 5, 59, 49, 15, 89, 74, 29, 14, 68, 82, 80, 56, 41, 36, 81, 66,
51, 58, 34, 59, 44, 19, 93, 28, 33, 18, 46, 61, 76, 14, 87, 84, 73, 71, 29, 94, 10, 35, 20,
35, 80, 8, 43, 79, 25, 60, 26, 11, 37, 94, 32, 90, 51, 11, 28, 76, 16, 63, 95, 13, 60, 59,
96, 95, 55, 92, 28, 3, 17, 91, 36, 20, 24, 0, 86, 82, 58, 93, 68, 54, 80, 56, 22, 67, 82,];
for i in v {
map.insert(i);
}
let length = map.len();
println!("一共有{}不同的数字,错失了{}个",length,100-length);
let mut missing_vex = Vec::new();
for number in 0..100 {
if map.get(&number).is_none(){
missing_vex.push(number);
}
}
println!("错失的数字有: {:?}", missing_vex);
}
BinaryHeap
BinaryHeap
是一个有趣的集合,它会把最大的一个元素放在第一个,其他的元素无序排列。
use std::collections::BinaryHeap;
fn show_remain(i: &BinaryHeap<i32>) -> Vec<i32> {
let mut v = Vec::new();
for number in i {
v.push(*number);
}
v
}
fn main() {
let some_numbers = vec![1,4,7,90,70,88,68,92,40,54];
let mut heap = BinaryHeap::new();
for number in some_numbers {
heap.push(number);
}
while let Some(n) = heap.pop() {
println!("移除的是{},保留后的为{:?}",n,show_remain(&heap));
}
}
输出结果:
移除的是92,保留后的为[90, 70, 88, 40, 54, 4, 68, 1, 7]
移除的是90,保留后的为[88, 70, 68, 40, 54, 4, 7, 1]
移除的是88,保留后的为[70, 54, 68, 40, 1, 4, 7]
移除的是70,保留后的为[68, 54, 7, 40, 1, 4]
移除的是68,保留后的为[54, 40, 7, 4, 1]
移除的是54,保留后的为[40, 4, 7, 1]
移除的是40,保留后的为[7, 4, 1]
移除的是7,保留后的为[4, 1]
移除的是4,保留后的为[1]
移除的是1,保留后的为[]
本作品采用《CC 协议》,转载必须注明作者和本文链接