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 のキーには、ブール値、整数、文字列、 または EqHash トレイトを実装するその他の任意の型を使用できます。 これについては次のセクションで詳しく説明します。

ベクターと同様に、HashMap は拡張可能ですが、HashMap は余分な領域がある場合に 自身を縮小することもできます。 HashMap::with_capacity(uint) を使用して特定の初期容量を持つ HashMap を作成することも、 HashMap::new() を使用してデフォルトの初期容量を持つ HashMap を取得することもできます (推奨)。

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()` は、挿入された値が新しい場合は `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()` は、任意の順序で
    // (&'a key, &'a value) のペアを生成するイテレーターを返す。
    for (contact, &number) in contacts.iter() {
        println!("Calling {}: {}", contact, call(number));
    }
}

ハッシュ化とハッシュマップ (ハッシュテーブルと呼ばれることもあります)の仕組みについて詳しくは、 Hash Table Wikipedia を参照してください。