optimization - 有条件地添加到 HashMap 的最佳方法,查找次数越少越好?

标签 optimization hashmap rust

使用 HashMap 时,如果键不存在,通常需要添加一个key:value 对。

这读起来不错,但并不尽如人意。

if !map.contains(key) {
    let val = create_val();
    map.insert(key, val);
    some_creation_logic(val);
} else {
    let val = map[key];
    some_update_logic(val);
}

虽然这有效,但它总是会进行 2 次查找。

我能得到的最接近的方法是使用 Entry.or_insert(或 or_insert_with),计算长度以便可以采用 else 分支.

let map_len_prev = map.len();
let val = map.or_insert_with(key, create_val);
if map_len_prev != map.len() {
    some_creation_logic(val);
} else {
    some_update_logic(val);
}

是否有一种更清晰的方法可以在需要时插入一个值,同时为它已经存在/不存在的情况保持运行两个逻辑分支的方式?

最佳答案

你可以只匹配Entry:

use std::collections::hash_map::Entry::{Occupied, Vacant}; 

match map.entry(key) {
    Occupied(val) => {
        some_update_logic(val.get());
    },
    Vacant(entry) => {
        let val = entry.insert(create_val());
        some_creation_logic(val);
    }
}

关于optimization - 有条件地添加到 HashMap 的最佳方法,查找次数越少越好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39560296/

相关文章:

algorithm - 如何在不存储列表的情况下计算或近似列表的中位数

mysql - 加入 vs where-SQL

C#相当于覆盖类中的__dict__

java - 如何将 map 转换为对象?

multithreading - 我如何将非静态数据发送到 Rust 中的线程,此示例是否需要它?

java - 获取位置安卓?

hashmap - 使用数据库中的值填充枚举

rust - 不能在一个代码中一次多次借用可变的 - 但可以在另一个非常相似的代码中

rust - 检查 SPI 是否在 STM32 上正确初始化的最简单方法是什么?

java - HashMap Java 8 实现