如何在 HashMap 中找到某个值的键?

euc*_*lio 7 hashmap rust

我有一个std::collections::HashMap包含一些条目的。我想找到与哈希映射中已经存在的特定值对应的键。

euc*_*lio 10

迭代 的条目HashMap,找到与值匹配的条目,并映射到键。

use std::collections::HashMap;

fn find_key_for_value<'a>(map: &'a HashMap<i32, &'static str>, value: &str) -> Option<&'a i32> {
    map.iter()
        .find_map(|(key, &val)| if val == value { Some(key) } else { None })
}

fn main() {
    let mut map = HashMap::new();
    map.insert(1, "a");
    map.insert(2, "b");
    map.insert(3, "c");

    assert_eq!(find_key_for_value(&map, "a"), Some(&1));
    assert_eq!(find_key_for_value(&map, "z"), None);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这只会找到第一个匹配的值,如果您想找到所有匹配的值,您可以使用filter_map并将它们收集到一个Vec

use std::collections::HashMap;

fn find_keys_for_value<'a>(map: &'a HashMap<i32, &'static str>, value: &str) -> Vec<&'a i32> {
    map.iter()
        .filter_map(|(key, &val)| if val == value { Some(key) } else { None })
        .collect()
}

fn main() {
    let mut map = HashMap::new();
    map.insert(1, "a");
    map.insert(2, "b");
    map.insert(3, "c");
    map.insert(4, "a");

    let mut keys = find_keys_for_value(&map, "a");
    keys.sort();
    assert_eq!(keys, vec![&1, &4]);
}
Run Code Online (Sandbox Code Playgroud)

  • “并将它们收集到 Vec 中”最好返回 `impl Iterator&lt;Item=i32&gt; + 'a` 并让用户在必要时收集。另外,有趣的是我不知道 `find_map()` 存在 (3认同)