《快速入手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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!