如何检查键是否对应于 Rust 中 HashMap 中的值?



我认为有用于此目的的 contains_key() 方法,但我收到错误,因为我想使用将布尔值作为返回值的 Some 和 None。 get() 方法适用于相反的状态,即查找与键对应的值。主要目标是创建一个终结点,用于按值查找键,反之亦然。我已经提出了以下逻辑来查找值,但坚持查找键:

fn main() {
use std::collections::HashMap;
let mut my_info: HashMap<String, String> = HashMap::new();
my_info.insert("Brad".to_string(), "Pitt".to_string());
my_info.insert("Tom".to_string(), "Cruise".to_string());
match my_info.get("Brad") {
Some(firstname) => println!("Last Name: {}", firstname),
None => println!("FIRST NAME NOT FOUND")
}
}

你不能直接这样做。HashMap都是关于从keyvalue。你可以在这里做的是有两个HashMap,一个用于keyvalue,另一个用于valuekey。注意:这意味着keyvalue将是独立的,一个的更改不会改变另一个。此外,这意味着它们将是不同的对象,可以使您的内存使用量加倍/花费大量时间/可能是不可能的。您还需要keyvalue都是唯一且可哈希的。代码可以是这样的:

struct BiMap<K, V> {
key_val: HashMap<K, V>,
val_key: HashMap<V, K>
}
impl<K, V> BiMap<K, V> {
pub fn get_by_key(&self, key: &K) -> Option<V> {
self.key_val.get(key)
}
pub fn get_by_val(&self, val: &V) -> Option<K> {
self.val_key.get(val)
}
}

(那里很可能有一些类型错误。按照编译器消息/Hashmap::get的签名进行修复。

另一种方法,如果你不能做上述/不想做上述,是遍历整个哈希图,比较值并在找到时返回键。代码将有点像这样:

my_info.iter().find(|(_, v)| v == last_name).map(|(first_name, _)| first_name)

这将为您提供第一个指定last_name的人的first_name

有一个用于双向地图的板条箱:https://docs.rs/bidirectional-map/0.1.0/bidirectional_map/

最新更新