HashMap是由keys和values組成的集合。你使用鍵來查詢與鍵匹配的值。你可以只用HashMap::new()
建立一個新的HashMap,並使用.insert(key, value)
來插入元素。
可以通過get
方法來獲取到對應的值,它會返回一個Option
,如果存在則返回Some(value)
,如果不存在則返回None
。entry
來檢查鍵是否繫結了一個值,結合or_insert
如果只有鍵,沒有對應的值則插入。這個鍵可以不存在也可以沒有相關聯的值。
我們可以根據一箇舊值來更新一個值,or_insert
方法會返回這個鍵對應的值是一個可變引用,我們更新它的值先將它解引用,進行更新
示例程式碼:
use std::collections::HashMap;
fn main() {
let mut collections = HashMap::new();
collections.insert(1, "Beijing".to_string());
collections.insert(2, "Shanghai".to_string());
collections.insert(3, "Hangzhou".to_string());
println!("{:?}", collections);
//HashMap裡面的值是無序的,同時列印它們多次列印出現的順序可能都不同
//{2: "Shanghai", 3: "Hangzhou", 1: "Beijing"}
//{3: "Hangzhou", 1: "Beijing", 2: "Shanghai"}
//如果HashMap有一個鍵,我們將它放進去時,它會覆蓋原來的值
collections.insert(1, "Nanjing".to_string());
println!("{:?}", collections);
//{1: "Nanjing", 3: "Hangzhou", 2: "Shanghai"}
collections.entry(1).or_insert("Chongqing".to_string()); //有值不插入
println!("{:?}", collections);
collections.entry(4).or_insert("Sanya".to_string());
println!("{:?}", collections);
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 is {:?}", map);
let a = collections.get(&1);
println!("a is {:?}", a);
}
BTreeMap 和 HashMap 的區別是它是有序的,而HashMap是無序的。
use std::collections::BTreeMap;
fn main() {
//將HashMap替換成BTreeMap
let mut collections = BTreeMap::new();
collections.insert(1, "Beijing".to_string());
collections.insert(2, "Shanghai".to_string());
collections.insert(3, "Hangzhou".to_string());
println!("{:?}", collections);
// 列印結果 BTreeMap會按順序列印
// {1: "Beijing", 2: "Shanghai", 3: "Hangzhou"}
}
HashSet和BTreeSet
HashSet實際上是隻有key
的HashMap,同理BtreeSet。 它有鍵沒有值。
use std::collections::HashSet;
fn main() {
let mut map = HashSet::new();
let v = vec![ 94, 42, 59, 64, 32, 22, 38, 5, 59, 49, 15, 89, 74, 29, 14, 68, 82, 80, 56, 41, 36, 81, 66,
51, 58, 34, 59, 44, 19, 93, 28, 33, 18, 46, 61, 76, 14, 87, 84, 73, 71, 29, 94, 10, 35, 20,
35, 80, 8, 43, 79, 25, 60, 26, 11, 37, 94, 32, 90, 51, 11, 28, 76, 16, 63, 95, 13, 60, 59,
96, 95, 55, 92, 28, 3, 17, 91, 36, 20, 24, 0, 86, 82, 58, 93, 68, 54, 80, 56, 22, 67, 82,];
for i in v {
map.insert(i);
}
let length = map.len();
println!("一共有{}不同的數字,錯失了{}個",length,100-length);
let mut missing_vex = Vec::new();
for number in 0..100 {
if map.get(&number).is_none(){
missing_vex.push(number);
}
}
println!("錯失的數字有: {:?}", missing_vex);
}
BinaryHeap
BinaryHeap
是一個有趣的集合,它會把最大的一個元素放在第一個,其他的元素無序排列。
use std::collections::BinaryHeap;
fn show_remain(i: &BinaryHeap<i32>) -> Vec<i32> {
let mut v = Vec::new();
for number in i {
v.push(*number);
}
v
}
fn main() {
let some_numbers = vec![1,4,7,90,70,88,68,92,40,54];
let mut heap = BinaryHeap::new();
for number in some_numbers {
heap.push(number);
}
while let Some(n) = heap.pop() {
println!("移除的是{},保留後的為{:?}",n,show_remain(&heap));
}
}
輸出結果:
移除的是92,保留後的為[90, 70, 88, 40, 54, 4, 68, 1, 7]
移除的是90,保留後的為[88, 70, 68, 40, 54, 4, 7, 1]
移除的是88,保留後的為[70, 54, 68, 40, 1, 4, 7]
移除的是70,保留後的為[68, 54, 7, 40, 1, 4]
移除的是68,保留後的為[54, 40, 7, 4, 1]
移除的是54,保留後的為[40, 4, 7, 1]
移除的是40,保留後的為[7, 4, 1]
移除的是7,保留後的為[4, 1]
移除的是4,保留後的為[1]
移除的是1,保留後的為[]
本作品採用《CC 協議》,轉載必須註明作者和本文連結