隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

我的相片
目前從事軟體相關行業,喜歡閱讀、健身、喝調酒。習慣把遇到的問題記下來,每天做一些整理方便自己以後查。 Python、Rust、Kotlin等程式語言皆為自學,目前比較著重在Rust語言,歡迎一起討論。

2023年12月18日 星期一

Rust HashMap概述1 - key與value集合


HashMap 1

是一個相當好用的工具

他可以對key(鍵)和value(值)操作

每個key對應一個value

跟其他語言的dictionary蠻像的

但還是有一點差別

Rust本身對於所有權和生命週期比較嚴謹

這篇會稍微介紹要如何使用Hashmap

會有其他篇介紹更詳細的用法


例子

假設我是一個學生

這學期有各種科目

包括英文、數學、國文

其中每個科目都有很多考試

希望把每個考試成績分類一下

可以透過Hashmap

直接透過程式看

use std::collections::HashMap;

struct Score {
    subject: String,
    score: u8,
}
impl Score {
    fn new(subject: &str, score: u8) -> Score{
        Score{
            subject: subject.to_string(),
            score
        }
    }
}
fn main() {
    let student_score = vec![
        Score::new("Chinese", 90),
        Score::new("Math", 80),
        Score::new("Chinese", 50),
        Score::new("English", 20),
        Score::new("Chinese", 30),
        Score::new("Math", 10),
    ];
    let mut score_map: HashMap<String, Vec<u8>> = HashMap::new();
    for score in student_score {
        let subject_entry = score_map.entry(score.subject).or_insert(vec![]);
        subject_entry.push(score.score);
    }
    println!("{:#?}", score_map);
}

稍微敘述一下程式在打什麼

先設定struce Score主要用來定義subject(科目)和score(分數)的型態

並透過impl Score存放數值

將每一科的科目名稱和分數存放在student_score變數中

創建一個名為score_map的變數,以HashMap存放資料

透過for迴圈將每個成績取出來

如果HashMap的key沒有該科目

會創建一個vec

並且將新的成績push進去

最後結果會長

{
    "Chinese": [
        90,    
        50,    
        30,    
    ],
    "Math": [  
        80,    
        10,    
    ],
    "English": [
        20,
    ],
}


這邊有幾個用到的方法

HashMap::new()[2]

pub fn new() -> HashMap<K, V, RandomState>

創建一個HashMap

不用輸入其他東西

entry[3]

pub fn entry(&mut self, key: K) -> Entry<'_, K, V>

輸入key,輸出Entry

entry主要是根據key去修改value的值

or_insert[4]

pub fn or_insert(self, default: V) -> &'a mut V

self為Entry本身

回傳&'a mut

如果key沒有value值

可以輸入default當作初始value

如果有值就不會額外輸入default

因為回傳是&mut

也就是可以修改value值


進階題目

如果這次我有多位學生

每位學生都有數學英文國文三個科目

每個科目都有很多分數

並且希望額外知道國文的所有成績

該怎麼做?

下一章[5]會再額外講到

get、get_key_value、HashMap的value又是一個HashMap的做法


參考資料

[1] https://doc.rust-lang.org/std/collections/struct.HashMap.html#

[2] https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.new

[3] https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.entry

[4] https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.or_insert

[5] https://lageeblog.blogspot.com/2023/12/rust-hashmap-getgetkeyvaluehashmap.html

0 comments:

張貼留言