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

在Rust的HashMap中“插入或更新”操作的最佳实践是什么?,rust,hashmap,Rust,Hashmap,我正在寻找插入或更新操作的最佳实践,因为它非常常用,我认为我们需要优化它的写作风格和效率 假设以下场景:我得到了一个hashmap let类:HashMapString,HashSet=HashMap::new 用于存储学生和WHO类 数据应采用以下形式: {key:ClassA,value:{Bob,Marry,Jack}, {key:ClassB,value:{Lee,Tom}}, 现在我得到了一组新的学生和他/她的班级的数据,让我们采取: {name:Alice,class:ClassC}

我正在寻找插入或更新操作的最佳实践,因为它非常常用,我认为我们需要优化它的写作风格和效率

假设以下场景:我得到了一个hashmap

let类:HashMapString,HashSet=HashMap::new 用于存储学生和WHO类

数据应采用以下形式:

{key:ClassA,value:{Bob,Marry,Jack}, {key:ClassB,value:{Lee,Tom}}, 现在我得到了一组新的学生和他/她的班级的数据,让我们采取:

{name:Alice,class:ClassC} 因为我不确定这个类是否已经出现在classes HashMap中,我需要首先确定它是否存在,如果存在,我将更新该值,如果不存在,我将添加一个新的键->值对

在没有任何不必要的移动或复制的情况下,正确的方法是什么?基于其他答案,我尝试使用std::collections::hash_map::Entry,但失败了


谢谢

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

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);
}
该函数返回一个输入值,该值表示映射中包含的值或它在映射中的位置。这个条目类型有很多函数来访问包含的值,并在需要时创建它。在您的情况下,最容易使用的函数是,如果值尚未在映射中,则创建一个默认值(一个空集)


然后,由于在映射中有对集合的可变引用,只需插入所需的值。

使用该映射的惯用方法如下:

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);
}
该函数返回一个输入值,该值表示映射中包含的值或它在映射中的位置。这个条目类型有很多函数来访问包含的值,并在需要时创建它。在您的情况下,最容易使用的函数是,如果值尚未在映射中,则创建一个默认值(一个空集)


然后,由于在映射中有对集合的可变引用,只需插入所需的值。

,还可以查看和搜索尚未存在的集合。一般来说,在描述问题时,这些问题往往会更好,但我在相关细节方面没有做到,另外,查看和搜索不存在。在描述问题时,问题通常也会更好,但我在相关细节方面失败了。是的,我认为如果目标值类型实现默认特征,这应该是一个最佳实践,谢谢。是的,我认为如果目标值类型实现默认特征,这应该是一个最佳实践,谢谢。