HashMap 用于存儲鍵值對,類似于其他編程語言中的字典。在標(biāo)準(zhǔn)庫的定義是 HashMap<K, V> ,下面將用代碼解釋 HashMap 的基本使用。
use std::collections::HashMap;
fn main() {
// 先定義一個(gè)hashmap, 然后插入值
let mut scores = HashMap::new();
scores.insert(1001, 100);
scores.insert(1002, 200);
scores.insert(1003, 300);
println!("原始map: {:?}", scores);
// 判斷是否存在某個(gè)Key
let has1001 = scores.contains_key(&1001);
println!("是否有key 1001: {}", has1001);
// 移除一個(gè)值,參數(shù)是key的引用
scores.remove(&1001);
println!("移除 1001 后: {:?}", scores);
// 插入一個(gè)已經(jīng)存在的值將覆蓋原有值
scores.insert(1002, 101);
println!("覆蓋 1002的值: {:?}", scores);
// 如果一個(gè)鍵不存在,則插入新的鍵值對,如果存在,則什么也不做
scores.entry(1002).or_insert(500);
println!("如果 1002 不存在,則插入key 1002, value 500: {:?}", scores);
scores.entry(1004).or_insert(700);
println!("如果 1004 不存在,則插入key 1004, value 700: {:?}", scores);
// 獲取一個(gè)鍵的值,如果存在,返回類型是枚舉 Option<T>
// 如果有值,則返回值Some(T),沒有則返回None
let value_1004 = scores.get(&1004);
println!("獲取1004的value: {:?}", value_1004);
let value_2000 = scores.get(&2000);
println!("獲取2000的value: {:?}", value_2000);
// 先獲取原始值,的引用,然后改變原始值
let value_1003 = scores.entry(1003).or_insert(0);
*value_1003 += 54;
println!("在原始1003的值的基礎(chǔ)上,加上54: {:?}", scores);
}
上面的代碼使用最基本的拷貝類型 i32 作為鍵和值解釋了一個(gè) HashMap 基本的方法應(yīng)用,更詳細(xì)的方法可以參考 HashMap的文檔
下面看一下以String類型作為 key 和 value 會怎么樣
use std::collections::HashMap;
fn main() {
let key = "Jack".to_string();
let value = "上海市浦東新區(qū)".to_string();
let mut map:HashMap<String, String> = HashMap::new();
map.insert(key, value);
println!("map: {:?}", map);
// println!("{} {}", key, value);
}
上面代碼中,看最后一句被注釋掉的代碼,如果去掉注釋,將編譯出錯(cuò),因?yàn)槲覀兌x的 key 和 value 是String類型的,在插入到 hashmap 后,key 和 value 的的所有權(quán)將移動到 hashmap 中,所以再訪問就會出錯(cuò)。
上面第7行代碼,定義一個(gè) HashMap 時(shí),我們給map變量指定了具體的HashMap類型,這里不指定也行,Rust會根據(jù)上下文自動推斷中 HashMap 中存儲的數(shù)據(jù)類型。
let mut map = HashMap::new();
這里只是簡單地介紹了一下 HashMap 的一些應(yīng)用,更復(fù)雜的使用將在后面的博客中詳細(xì)介紹。