<<快速入手Rust>>14.HashMap和其他集合

sangshengjie發表於2021-03-23

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 協議》,轉載必須註明作者和本文連結

相關文章