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

На відміну від векторів, які зберігають значення за цілочисельним індексом, HashMaps зберігають значення за ключем. Ключами HashMap можуть бути булеві значення, цілі числа, рядки або будь-який інший тип, що реалізує трейти Eq і Hash. Докладніше про це — у наступному розділі.

Як і вектори, HashMaps можна збільшувати, але HashMap також можуть зменшуватися, коли мають надлишок вільного місця. Ви можете створити HashMap із певною початковою місткістю за допомогою HashMap::with_capacity(uint), або використати 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));
    }
}

Докладніше про те, як працюють хешування та хеш-мапи (інколи звані хеш-таблицями), дивіться Вікіпедія про хеш-таблиці