rust - Rust 的 HashMap 中“插入或更新”操作的最佳实践是什么?
问题描述
我正在寻找一个insert-or-update
操作的最佳实践,因为它非常常用,我认为我们需要优化它的写作风格和效率。
假设以下场景:我有一个hashmap
let classes: HashMap(String, HashSet<String>) = HashMap::new()
用于存储学生和谁的班级。
预计数据格式如下:
{ key: "ClassA", value: {"Bob", "Marry", "Jack"}},
{ key: "ClassB", value: {"Lee", "Tom"}},
现在我得到了一个学生和他/她班级的一组新数据,让我们来看看:
{ name: "Alice", class: "ClassC"}
由于我不确定这个类是否已经出现在classes
HashMap中,所以我需要先弄清楚它是否存在,如果存在,我将更新值,如果不存在,我将添加一个新key->value
对。
没有任何不必要的移动或复制的正确方法是什么?根据其他答案,我尝试使用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);
}
该HashMap::entry()
函数返回一个Entry
值,该值表示地图中包含的值或如果它在地图中的位置。这种Entry
类型有很多函数可以访问包含的值,并在需要时创建它。在您的情况下,最简单的功能是or_default
如果该值尚未在地图中,则创建一个默认值(一个空集)。
然后,由于您对地图内的集合有一个可变引用,因此只需插入所需的值。
推荐阅读
- javascript - 将其他 js 文件函数调用到 AJAX 调用中
- vuejs2 - Vue2 / Vue Router:从导航守卫设置数据
- php - 自定义分类类别从搜索中排除
- python - 修复检查列表中整数的错误
- javascript - 如何异步事件处理程序?等待承诺 javascript
- mysql - 关于 MySQL 子查询 EXISTS 和 NOT EXISTS 的混淆
- google-chrome - 当我在 Instagram 的聊天系统(在 Chrome 上)发送消息时,有没有办法查看该特定消息的传出 HTTP 请求?
- r - 如何在数据框中的某些条件下检查重复?
- android - 片段中 applyStyle(int resId,boolean force) 的适当位置是什么?
- java - 用于数字孪生的 Azure 函数应用程序中的 NoClassDefFoundError