Rust 的 HashMap 中“插入或更新”操作的最佳实践是什么?

Ada*_*mer 9 hashmap rust

我正在寻找最佳实践insert-or-update operation, because it is very commonly used, I think we need to optimize both its writing style and efficiency.

假设以下场景:我有一个hashmap

let classes: HashMap(String, HashSet<String>) = HashMap::new()
Run Code Online (Sandbox Code Playgroud)

用于存储学生和谁的班级。

数据预计采用以下形式:

{ key: "ClassA", value: {"Bob", "Marry", "Jack"}},
{ key: "ClassB", value: {"Lee", "Tom"}},
Run Code Online (Sandbox Code Playgroud)

现在我得到了一个学生和他/她的班级的一组新数据,我们来看:

{ name: "Alice", class: "ClassC"}
Run Code Online (Sandbox Code Playgroud)

由于我不确定该类是否已经出现在 HashMap 中classes,因此我需要先弄清楚它是否存在,如果存在,我将更新该值,如果不存在,我将添加一个新的key->value pair.

没有任何不必要的移动或复制的正确方法是什么?根据其他答案,我尝试使用std::collections::hash_map::Entry but I failed.

谢谢!

rod*_*igo 14

使用该地图的惯用方法如下:

use std::collections::HashSet;
use std::collections::HashMap;

fn main() {
    let mut classes: HashMap<String, HashSet<String>> = HashMap::new();
    
    let e = classes.entry(String::from("ClassA"));
    e.or_default().insert(String::from("Alice"));

    let e = classes.entry(String::from("ClassA"));
    e.or_default().insert(String::from("Bob"));
    
    dbg!(&classes);
}
Run Code Online (Sandbox Code Playgroud)

HashMap::entry()函数返回一个Entry值,该值表示地图中包含的值或该值在地图中的位置。这种Entry类型有很多函数来访问所包含的值,并在需要时创建它。在你的情况下,最容易使用的功能是or_default如果该值尚未在地图中,则创建一个默认值(空集)。

然后,由于您对映射内的集合有可变引用,因此只需插入所需的值即可。