在開發程式時,我們常會使用HashMap來儲存key-value結構的資料。但很多時候我們的key-value資料會有不只一層,例如一個男女分班的學校,我們就需要有性別、班級、學號這三層的key-value結構,以確保各層的資料不會有重複的情況發生。或是可以分成國家、一級行政區、二級行政區等多層資料的世界地圖。



Leveled HashMap

「Leveled HashMap」是筆者開發的套件,提供了「LeveledHashMap」結構體,用來處理階層式的key-value資料,「LeveledHashMap」結構體的每一層都是一個HashMap結構實體,並非是每個key-value條目底下都自帶一個HashMap結構實體,因此可以確保每層的key皆不會相同。如此一來,在搜尋時可以直接指定要從哪個層級開始搜尋,效率極高。

Crates.io

https://crates.io/crates/leveled-hash-map

Cargo.toml

leveled-hash-map = "*"

使用方法

使用「use」關鍵字將「leveled_hash_map」這個crate下的「LeveledHashMap」結構體給引用到當前的程式範圍下。「LeveledHashMap」結構體的「new」關聯函數可以建立出「LeveledHashMap」結構體的實體。

以下介紹「LeveledHashMap」結構實體的增、刪、查、改之方式。

新增

「LeveledHashMap」結構實體提供了「insert」方法,可以將一個值,新增到一個Key鏈下。例如:

如果該Key鏈已經有存在的值,就會被回傳出來。

如果想要在同一層下,新增多個值,可以使用「LeveledHashMap」結構實體提供的「insert_many」方法,直接將一個HashMap結構實體新增至「LeveledHashMap」結構實體中的某個Key鏈的子Key中。例如:

如果該Key鏈的子Key中已經有存在的值,就會被回傳出來。

刪除

「LeveledHashMap」結構實體提供了「remove」方法,可以將一個值從一個Key鏈上移除。例如:

如果該Key鏈上確實有值,就會將該值和該Key鏈下所有層級的子Key和值回傳出來。

也可以使用「LeveledHashMap」結構實體提供的「remove_advanced」方法,來直接從某個層級開始,移除指定的Key鏈。可以省下檢查前面幾層Key鏈正確性的時間。例如:

查詢

「LeveledHashMap」結構實體提供了「get」方法,可以取得一個Key鏈上之值的不可變參考。例如:

也可以使用「LeveledHashMap」結構實體提供的「get_advanced」方法,來直接從某個層級開始,取得指定Key鏈的值的不可變參考。可以省下檢查前面幾層Key鏈正確性的時間。例如:

如果要取得某指定層級的HashMap結構實體的(不可變)參考,可以使用「LeveledHashMap」結構實體提供的「keys」方法。例如:

修改

「LeveledHashMap」結構實體提供的各類「get」方法,方法名稱後面皆可以加上「_mut」,來取得值的可變參考,如此就可以直接改變「LeveledHashMap」結構實體內的值。

使用案例

以下簡單建立一個擁有多國語言名稱的抽象「世界地圖」: