我尝试使用Rust集合(如BTreeMap)存储键值对以用作排序列表,但我发现它只与精确键匹配。 例如,在电话簿案例中,我可以找到具有精确键“David”的项目,但不能找到以“Dav”开头的项目:
use std::collections::BTreeMap;
fn main() {
let mut map = BTreeMap::new();
map.insert("Daniel", "798-1364");
// FOUND WITH EXACT MATCH ONLY
// like map.get(&"Daniel"), Not Found Here
match map.get(&"Dan") {
Some(&number) => println!("Found: {}", number),
_ => println!("Not Found."),
}
}
我可以使用BTreeMap
?
此外,如果我的密钥是i64
s,我是否可以找到一系列项目,例如当密钥大于1000时?我知道如何遍历所有项目,但我想迭代所找到的项目范围。
我可以按索引访问项目,手动进行二进制搜索吗?
答案 0 :(得分:7)
您可以使用BTreeMap::range
:
use std::collections::BTreeMap;
fn main() {
let mut map = BTreeMap::new();
map.insert("Alexia", "123-4567");
map.insert("Daniel", "798-1364");
map.insert("Miranda", "987-6543");
for (k, v) in map.range("Dan"..) {
println!("Found: {}: {}", k, v);
}
}
打印:
Found: Daniel: 798-1364
Found: Miranda: 987-6543
您可以将循环扩展为具有“开始”检查,一旦您不再匹配前缀,该检查将退出:
for (k, v) in map.range("Dan"..).take_while(|(k, _)| k.starts_with("Dan")) {
println!("Found: {}: {}", k, v);
}
此概念扩展到整数键大小写,但您也可以指定一个完整范围来将搜索限制为:
map.range("Dan".."E")
map.range(0..=1)