如何使用带前缀键搜索的排序键值映射?

时间:2014-12-07 15:53:28

标签: rust

我尝试使用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时?我知道如何遍历所有项目,但我想迭代所找到的项目范围。

我可以按索引访问项目,手动进行二进制搜索吗?

1 个答案:

答案 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)