Rust學習(17):Rust中的集合類型之Map

哈希Map通過一個哈希函數來實現顏射,決定如何將鍵和值放入內存中。

  • 與vector類型,哈希map將它們的數據存儲在堆上
  • 和vector一樣,哈希map是同質的: 所有的鍵必須是相同類型,值也必須都是相同類型

初始化

準備

use std::collections::HashMap;

1、方法1

let mut scores = HashMap::new();

scores.insert(String::from("blue"), 10);
scores.insert(String::from("yellow"), 50);

 println!("{:?}", scores)

2、方法2

    let teams  = vec![String::from("Blue"), String::from("Yellow")];
    let initial_scores = vec![10, 50];
    
    let scores:HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();
    println!("{:?}", scores)

3、初始化與所有權:

  • 對於像 i32 這樣的實現了 Copy trait 的類型,其值可以拷貝進哈希 map。對於像 String 這樣擁有所有權的值,其值將被移動而哈希 map 會成爲這些值的所有者
  • 如果將值的引用插入哈希 map,這些值本身將不會被移動進哈希 map。但是這些引用指向的值必須至少在哈希 map 有效時也是有效的
   let field_name = String::from("Favorite color");
   let field_value = String::from("Blue");

   let mut map = HashMap::new();
   map.insert(&field_name, field_value); //fileld_name無效

  println!("{}, {}", field_name, field_value); //error[E0382]: borrow of moved value: `field_value`

訪問map

use std::collections::HashMap;

fn main() {
   let mut scores = HashMap::new();

   scores.insert(String::from("blue"), 10);
   scores.insert(String::from("yellow"), 50);

    println!("{:?}", scores);

    println!("get---->{:?}", scores.get("blue"));

    for (k, v) in & scores{
        println!("{}:{}", k, v)
    }
    
}

在這裏插入圖片描述
get 返回 Option,所以結果被裝進 Some;如果某個鍵在哈希 map 中沒有對應的值,get 會返回 None

更新map

1、覆蓋一個值
當插入一個鍵時,如果已經有這個鍵了就直接覆蓋,如果沒有就創建鍵

use std::collections::HashMap;

fn main() {
   let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Blue"), 25);

    println!("{:?}", scores);
}

2、只在鍵沒有對應值時插入

use std::collections::HashMap;

fn main() {
   let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);

    scores.entry(String::from("Yellow")).or_insert(25);
    scores.entry(String::from("Blue")).or_insert(25);

    println!("{:?}", scores);
}

3、根據舊值更新值

use std::collections::HashMap;

fn main() {
    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)
}

在這裏插入圖片描述
參考:https://kaisery.github.io/trpl-zh-cn/ch08-03-hash-maps.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章