ハッシュマップ - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# ハッシュマップ

ベクタ型が値を整数のインデックスで保持するのに対し、`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");

        // 参照をとり、Option<&V>を返します。
        match contacts.get(&"Daniel") {
            Some(&number) => println!("Calling Daniel: {}", call(number)),
            _ => println!("Don't have Daniel's number."),
        }

        // `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.
        for (contact, &number) in contacts.iter() {
            println!("Calling {}: {}", contact, call(number));
        }
    }

ハッシングやハッシュマップ（ハッシュテーブルと呼ばれることもあります）の仕組みについて、より詳しく知りたい場合はWikipediaのハッシュテーブルのページを見てください。