哈希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