我正在寻找最佳实践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如果该值尚未在地图中,则创建一个默认值(空集)。
然后,由于您对映射内的集合有可变引用,因此只需插入所需的值即可。
| 归档时间: |
|
| 查看次数: |
5950 次 |
| 最近记录: |