ハッシュマップ
ベクタ型が値を整数のインデックスで保持するのに対し、HashMap
ではキーで保持します。HashMap
のキーはブーリアン、整数、文字列等のEq
あるいはHash
トレイトを保持する型なら何でもOKです。後でより詳しく見ていきます。
ベクタ型と同様、伸長可能ですが、HashMap
の場合さらに、スペースが余っているときには小さくすることも可能です。HashMap
を一定の容量のエリアに作成するときはHashMap::with_capacity(uint)
を、デフォルトの容量で作成するときはHashMap::new()
を用います。後者が推奨されています。
use std::collections::HashMap; fn call(number: &str) -> &str { match number { "798-1364" => "We're sorry, the call cannot be completed as dialed. Please hang up and try again.", "645-7689" => "Hello, this is Mr. Awesome's Pizza. My name is Fred. What can I get for you today?", _ => "Hi! Who is this again?" } } fn main() { let mut contacts = HashMap::new(); contacts.insert("Daniel", "798-1364"); contacts.insert("Ashley", "645-7689"); contacts.insert("Katie", "435-8291"); contacts.insert("Robert", "956-1745"); // Takes a reference and returns Option<&V> // 参照をとり、Option<&V>を返す。 match contacts.get(&"Daniel") { Some(&number) => println!("Calling Daniel: {}", call(number)), _ => println!("Don't have Daniel's number."), } // `HashMap::insert()` returns `None` // if the inserted value is new, `Some(value)` otherwise // `HashMap::insert()`は // insertされた値が新しい場合は`None`を // そうでなければ`Some(value)`を返す。 contacts.insert("Daniel", "164-6743"); match contacts.get(&"Ashley") { Some(&number) => println!("Calling Ashley: {}", call(number)), _ => println!("Don't have Ashley's number."), } contacts.remove(&"Ashley"); // `HashMap::iter()` returns an iterator that yields // (&'a key, &'a value) pairs in arbitrary order. // `HashMap::iter()`は(&'a key, &'a value) // のペアを順不同で産出するイテレータを返す for (contact, &number) in contacts.iter() { println!("Calling {}: {}", contact, call(number)); } }
ハッシングやハッシュマップ(ハッシュテーブルと呼ばれることもあります)の仕組みについて、より詳しく知りたい場合はWikipediaのハッシュテーブルのページを見てください。