使用部分键从 Hashmap 中检索值

Sre*_*yas 3 hashmap rust

我有一个带有键类型的 HashMap(i64,usize)

假设我有一个用例,仅使用键元组的第一部分从此 HashMap 检索数据。

例如我有这样的样本数据

(-1, 1): "1st -1 Resident", 
(1, 1): "1st 1 Resident", 
(1, 0): "Oth 1 Resident", 
(1, 2): "2nd 1 Resident", 
(-1, 2): "2nd -1 Resident", 
(-1, 0): "Oth -1 Resident"
Run Code Online (Sandbox Code Playgroud)

我想检索或操作所有数据-1作为键元组的第一个条目。或者就上面的例子而言, 的所有居民-1。我目前正在这样做,循环遍历 Hashmap 中的所有条目并手动检查键元组的第一部分。

use std::collections::HashMap;

fn main(){
    let mut hmap: HashMap<(i64,usize), &str> = HashMap::new();
    hmap.insert((-1,0), "Oth -1 Resident");
    hmap.insert((-1,1), "1st -1 Resident");
    hmap.insert((-1,2), "2nd -1 Resident");
    
    hmap.insert((1,0), "Oth 1 Resident");
    hmap.insert((1,1), "1st 1 Resident");
    hmap.insert((1,2), "2nd 1 Resident");

    for (k,v) in &hmap {
        if k.0 == -1 {
            println!("{:?}",v);
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?这是我当前工作的链接(游乐场链接

Mas*_*inn 5

有没有更好的方法来做到这一点?

哈希映射则不然,因为条目是通过整个键的哈希来本地化的,所以不可能进行部分匹配。

但是,可以使用BTreeMap: BTreeMap 的条目根据键的顺序进行定位,因此您可以基于 range 迭代子集,这也可以用作前缀匹配/搜索(这就是数据库索引使用 btree 的原因)默认情况下,它提供比哈希更灵活的查询)。

(-1, usize::MIN)在这里,您可以请求从包含开始到排除结束的范围(0, usize::MIN),它会为您提供键以 开头的所有条目-1

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=2a78568fa2870afa949919075d7c3579

use std::collections::BTreeMap;

fn main(){
    let mut hmap: BTreeMap<(i64,usize), &str> = BTreeMap::new();
    hmap.insert((-1,0), "Oth -1 Resident");
    hmap.insert((-1,1), "1st -1 Resident");
    hmap.insert((-1,2), "2nd -1 Resident");
    
    hmap.insert((1,0), "Oth 1 Resident");
    hmap.insert((1,1), "1st 1 Resident");
    hmap.insert((1,2), "2nd 1 Resident");

    for (k,v) in hmap.range((-1, usize::MIN)..(0, usize::MIN)) {
        println!("{k:?} {v}");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

(-1, 0) Oth -1 Resident
(-1, 1) 1st -1 Resident
(-1, 2) 2nd -1 Resident
Run Code Online (Sandbox Code Playgroud)