我有一个密钥类型为(i64,usize)的HashMap

假设我有一个仅使用键元组的第一部分从该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"

我想检索或操作键元组的第一个条目为-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);
        } 
    }
}

有没有更好的方法来做这件事? 以下是我当前工作的链接(playground link)

推荐答案

有没有更好的方法来做这件事?

不使用散列映射,因为条目通过entire键的散列进行本地化,因此不可能进行部分匹配.

然而,使用BTreeMap也是可能的:BTreeMap的条目是基于ordering个键定位的,所以您可以使用iterate a subset based off of a 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}");
    }
}

输出:

(-1, 0) Oth -1 Resident
(-1, 1) 1st -1 Resident
(-1, 2) 2nd -1 Resident

Rust相关问答推荐

使用pyo3::Types::PyIterator的无限内存使用量

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

无法理解铁 rust &S错误处理

如何指定不同的类型来常量Rust中的泛型参数?

如何使用盒装枚举进行模式匹配?

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

程序在频道RX上挂起

为什么BufReader实际上没有缓冲短寻道?

.在 Rust 模块标识符中

RUST 中的读写器锁定模式

提取指向特征函数的原始指针

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

如何为整数切片定义一个带有额外函数的特性别名?

将多维数组转换为切片

trait 对象指针的生命周期

我什么时候应该使用特征作为 Rust 的类型?

将一片字节复制到一个大小不匹配的数组中

发生移动是因为 `data` 的类型为 `Vec`,它没有实现 `Copy` 特性

您如何使用枚举反序列化字符串,其中任何其他值反序列化为新类型变体同时保留字符串?

如何用另一个变量向量置换 rust simd 向量?