Ha

Hashmap 在 Rust

{other: "%{count} 個練習"}

關於 Hashmap

HashMap是一種容器,可以用來存放鍵值對。在其他程式語言中,這種資料結構有時稱為關聯陣列或雜湊表。映射裡包含一組鍵,每個鍵都對應到特定的值。使用者只要傳入對應的鍵,就能取回存放的值,也可以插入、刪除鍵以及對應的值。

HashMap是泛型集合(就像標準函式庫裡大多數集合一樣),因此支援各種型別作為鍵,包括使用者自訂的結構體和元組。它的值可以是任何型別。

建立HashMap

使用HashMap::new()函式即可建立HashMap。下面的程式碼片段建立了一個HashMap,把隊名對應到分數。

use std::collections::HashMap;

let mut scores = HashMap::new();

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

存取HashMap中的值

如果已知某個值存在於HashMap中,就適合使用索引運算子([])。舉例來說,要取得 Blue 隊的分數,可以用scores["Blue"]。不過,如果HashMap裡沒有對應的鍵值對,這個操作就會 panic。

除了索引運算子之外,還有另外兩種存取HashMap中值的方法。第一種是使用get成員函式:

if let Some(blue_score) = scores.get("Blue") {
    println!("Blue scored: {blue_score} \n");
}

get會取得指定鍵所對應的值。如果提供的鍵不存在於HashMap中,它會回傳None;如果鍵存在,則回傳Some(value)。想進一步了解 Rust 的 Option,請參考 Option 概念。

另一種存取HashMap中值的方法,是使用entry方法。entry方法(或稱 entry API)會回傳HashMap中該鍵值對項目的參考。這個項目代表該鍵在雜湊中的狀態。如果鍵不存在,項目裡就沒有值(而且可以插入一個值)。

let mut vote_counter: HashMap<_, usize> = HashMap::new();
let votes = ["Blue", "Red", "Red", "Blue", "Red", "Blue", "Blue"];
for vote in votes {
    let count = vote_counter.entry(vote).or_default();
    *count += 1;
}

println!("{vote_counter:#?}");

這套 API 讓某些常見的存取模式變得非常方便,為此還有一個專門的概念(Entry API)。

效率

HashMap相對快速,所有涉及單一鍵的操作都具有攤銷後的常數時間複雜度(O(1))。

Trait 界限

HashMap是泛型資料結構,這表示它支援任意型別作為鍵和值,只有一個限制:型別若要作為鍵,就必須實作兩個 trait:Eq和Hash。值型別則沒有任何 trait 界限。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟