fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
println!("{:?}",scores);
}
fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
println!("value: {}",scores["Blue"]); // 存在则打印,不存在会panic
}
fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let team_name = String::from("Blue");
// scores.get(&team_name):
// 在scores哈希表(或者Dictionary)中查找对应team_name键(key)的值,返回的是一个Option类型
// .copied():
// Option类型上的方法,如果里面的值存在(在这里即scores.get(&team_name)查找到的值),就复制一个相同的值出来
// .unwrap_or(0):
// 返回Option中包含的值或者一个默认值
//
// 如果使用如下方式,则报错:called `Option::unwrap()` on a `None` value
// let team_name = String::from("Blue1");
// let score = scores.get(&team_name).copied().unwrap();
let score = scores.get(&team_name).copied().unwrap_or(0);
println!("value: {}",score); // 10
}
以上两种方法都必须保证访问的元素存在,否则会报错
fn main() {
use std::collections::HashMap;
let mut map = HashMap::new();
map.insert(1, "a");
assert_eq!(map.get(&1), Some(&"a"));
assert_eq!(map.get(&2), None);
}
fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
println!("{:?}",scores); //{"Yellow": 50, "Blue": 10}
scores.insert(String::from("Red"), 100);
println!("{:?}",scores);// {"Red": 100, "Yellow": 50, "Blue": 10}
}
哈希表中的元素没有顺序
fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
for (key, value) in &scores {
println!("{key}: {value}");
}
}
两种方法,contains_key和entry
contains_key方法用于检查HashMap中是否包含特定的键
它返回一个布尔值,指示键是否存在。
entry方法用于高效地处理键值对的插入和更新
它返回一个Entry枚举,可以是Occupied(键已存在)或Vacant(键不存在)
fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
if scores.contains_key("Red"){
println!("value :{}",scores["Red"]);
}else {
println!("Red is not found")
}
}
entry方法多用于对值的更新
or_insert方法:
在键对应的值存在时,就返回这个值的可变引用
如果不存在,则将参数作为新值插入并返回新值的可变引用
fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
scores.entry(String::from("Red")).or_insert(100);
scores.entry(String::from("Blue")).or_insert(50);
println!("{:?}", scores);//{"Blue": 10, "Red": 100, "Yellow": 50}
}
fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let team_list =["Blue","Red"];
for i in team_list{
if scores.contains_key(i){
scores.insert(i.to_string(), scores[i]+50);
}else{
scores.insert(i.to_string(), 50);
}
}
println!("{:?}",scores);//{"Red": 50, "Blue": 60, "Yellow": 50}
}
fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let team_list =["Blue","Red"];
for i in team_list{
let count = scores.entry(i.to_string()).or_insert(0);
*count += 50;
}
println!("{:?}",scores);//{"Red": 50, "Blue": 60, "Yellow": 50}
}
相比contains_key+insert ,这种方法更优雅
fn main() {
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
scores.insert(String::from("Red"), 80);
println!("{:?}",scores);//{"Blue": 10, "Yellow": 50, "Red": 80}
scores.remove("Red1");
println!("{:?}",scores);//{"Blue": 10, "Yellow": 50, "Red": 80}
scores.remove("Red");
println!("{:?}",scores);//{"Blue": 10, "Yellow": 50}
}