我有一个带有键类型的 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)
有没有更好的方法来做到这一点?这是我当前工作的链接(游乐场链接)
有没有更好的方法来做到这一点?
哈希映射则不然,因为条目是通过整个键的哈希来本地化的,所以不可能进行部分匹配。
但是,可以使用BTreeMap: BTreeMap 的条目根据键的顺序进行定位,因此您可以基于 range 迭代子集,这也可以用作前缀匹配/搜索(这就是数据库索引使用 btree 的原因)默认情况下,它提供比哈希更灵活的查询)。
(-1, usize::MIN)在这里,您可以请求从包含开始到排除结束的范围(0, usize::MIN),它会为您提供键以 开头的所有条目-1。
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)