使用 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/