Rust 新手,试图找出从哈希映射中递减值并在递减后的值达到 0 时删除相应键的 idomatic 方法。 我正在这样做,但不确定这是否是最好的方法:
use std::collections::HashMap;
fn main() {
let mut frequency = HashMap::from([(2, 1), (3, 4), (5, 6)]);
let key = 2;
if let Some(val) = frequency.get_mut(&key) {
*val -= 1;
if *val == 0 {
frequency.remove(&key);
}
}
println!("{:?}", frequency);
}
我想到的另一个方法是对值使用 match 构造,如下所示:
use std::collections::HashMap;
fn main() {
let mut frequency = HashMap::from([(2, 1), (3, 4), (5, 6)]);
let key = 2;
if let Some(val) = frequency.get_mut(&key) {
match *val {
1 => {
frequency.remove(&key);
}
_ => *val -= 1,
}
}
println!("{:?}", frequency);
}
我认为没有惯用的方式来使用
if
或 match
。可读性是最重要的,所以这可能是您个人的选择(尽管您可以使用 match
跳过增量)。
entry()
以避免进行两次查找:
let mut frequency = HashMap::from([(2, 1), (3, 4), (5, 6)]);
if let Entry::Occupied(mut o) = frequency.entry(2) {
*o.get_mut() -= 1;
if *o.get() == 0 {
o.remove_entry();
}
}
使用
entry
,你甚至可以直接使用guards来匹配结果:
match frequency.entry(2) {
Entry::Occupied(o) if *o.get() == 1 => {
o.remove_entry();
}
Entry::Occupied(mut o) => *o.get_mut() -= 1,
Entry::Vacant(_) => (),
};