HashMap 字典

简介

在Rust 中,HashMap 是一种键值对存储的集合类型,它提供了高效的插入、查找和删除操作。

HashMap<K, V>

键值对的形式存储数据,一个键(Key)对应一个值(Value);

Hash 函数:决定如何在内存中存放K和V;

创建一个 HashMap

fn main() {
    let mut map:HashMap<String,String> = HashMap::new();

}

使用 insert 添加键值对

fn main() {
    let mut map:HashMap<String,String> = HashMap::new();
    map.insert("name".to_string(), "test".to_string());
}

使用collect方法创建HashMap

在元素类型为 Tuple 的 Vector 上使用 collect方法,可以组建一个 HashMap:

要求 Tuple 有两个值:一个作为K,一个作为V;

collect方法可以把数据整合成很多种集合类型,包括HashMap;

返回值需要显式指明类型;

将2个集合转换为一个 map 的示例 :

fn main() {
    let name:Vec<String> = vec!["John".to_string(),"Mary".to_string(),"Bob".to_string()];
    let age:Vec<i32> = vec![25,30,28];
    let mut map:HashMap<String,i32> = HashMap::new();
    for i in 0..name.len(){
        map.insert(name[i].clone(),age[i]);
    }
    println!("{:?}",map);

    let map2:HashMap<_, _> = name.iter().zip(age.iter()).collect();
    println!("{:?}",map2);
}

HashMap 和所有权

1. 对于实现了 Copy trait 的类型(例如i32),值会被复制到 HashMap中
2. 对于拥有所有权的值(例如String),值会被移动,所有权会转移给HashMap

访问 HashMap 中的值

视图 get() 函数获取 hashMap 的值,传递一个键( 是一个引用 &

fn main() {
    let name:HashMap<i32, String> = HashMap::from([
        (1, "John".to_string()),
        (2, "Jane".to_string()),
        (3, "Jim".to_string())
    ]);
    println!("{:?}", name.get(&1));
}

替换现有的值

如果向 HashMap 插入一对键值,然后再插入同样的Key,但是不同的 Value,那么原来的 Value 会被替换掉:

fn main() {
    let mut names:HashMap<i32, String> = HashMap::from([
        (1, "John".to_string()),
        (2, "Jane".to_string()),
        (3, "Jim".to_string())
    ]);
    names.insert(3, "Joe".to_string());
    let name = names.get(&3);
    match name {
        Some(n) => println!("Name: {}", n),
        None => println!("No such name!")
    }
}

使用 remove 删除 key

fn main() {
    let mut names:HashMap<i32, String> = HashMap::from([
        (1, "John".to_string()),
        (2, "Jane".to_string()),
        (3, "Jim".to_string())
    ]);
    // 删除 k
    names.remove(&2);
    let name = names.get(&2);
    match name {
        Some(n) => println!("Name: {}", n),
        None => println!("No such name!")
    }
}