首页 文章

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

提问于
浏览
1

我尝试使用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 回答

  • 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)
    

相关问题