我认为有用于此目的的 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
都是关于从key
到value
。你可以在这里做的是有两个HashMap
,一个用于key
value
,另一个用于value
key
。注意:这意味着key
和value
将是独立的,一个的更改不会改变另一个。此外,这意味着它们将是不同的对象,可以使您的内存使用量加倍/花费大量时间/可能是不可能的。您还需要key
和value
都是唯一且可哈希的。代码可以是这样的:
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/