2014-12-07 50 views
1

我試圖用鏽的集合,如BTreeMap存儲鍵值對,用它作爲排序列表鏽排序鍵值地圖與部分鍵搜索

,並發現它匹配精確關鍵字只有 例如在電話簿中,我可以找到帶有「David」鍵的項目,但不能以「Dav」開頭。

let mut map = BTreeMap::new(); 
map.insert("Daniel", "798-1364"); 
match map.get(&"Dan") { // FOUND WITH EXACT MATCH ONLY 
         // like map.get(&"Daniel"), Not Found Here 
    Some(&number) => println!("Found: {}", number), 
    _ => println!("Not Found."), 
} 

我想知道如果我能做到部分匹配(字符串前綴)鐵鏽的std ::集合,如BTreeMap

而且,如果我的關鍵是Int64的,我能找到的項目範圍說關鍵> 1000 我想遍歷找到的項目範圍,但不知道如何遍歷所有項目

或者我可以通過索引訪問項目,以便我可以手動執行二分搜索嗎?

+0

注意'map.get'就沒有意義,因爲多個條目可能具有相同的前綴。它需要能夠返回零或多個。 – Shepmaster 2014-12-07 17:14:59

回答

6

你可以做什麼,你有TreeMap相同的部分:

use std::collections::TreeMap; 

fn main() { 
    let mut map = TreeMap::new(); 

    map.insert("Alexia", "123-4567"); 
    map.insert("Daniel", "798-1364"); 
    map.insert("Miranda", "987-6543"); 

    for x in map.lower_bound(&"Dan") { 
     println!("Found: {}" , x); 
    } 
} 

此打印:

Found: (Daniel, 798-1364) 
Found: (Miranda, 987-6543) 

可以延長循環有一個「開始,以」檢查將退出一旦你不再匹配一個前綴:

for x in map.lower_bound(&"Dan").filter(|&(name, _)| name.starts_with("Dan")) { 
    println!("Found: {}" , x); 
} 

這個概念應該很容易擴展到th e整數密鑰的情況。

+0

謝謝,您的示例按我的意願工作。 我沒有看到LOWER_BOUND和UPPER_BOUND API。 就進一步看看它和文檔是 http://doc.rust-lang.org/collections/tree_map/struct.TreeMap.html – Roger 2014-12-09 03:30:15

+0

啊,我鏈接到該文檔在我的回答的第一道防線。 ;-)這是可能的,應該有一個特點,使其他樹形圖(如BTreeMap)也必須有'lower_bound'和朋友,但它現在還沒有。如果你發現這個答案有用,請確保接受它! – Shepmaster 2014-12-09 03:56:48