Коллекция HashMap

HashMap хранит пары «ключ — значение» с быстрым доступом по ключу.

HashMap<K, V> — коллекция пар ключ-значение с доступом за константное время по ключу (хеш-таблица).

Создание и вставка

HashMap живёт не в прелюдии, поэтому его сначала импортируют. Затем вставляют пары через insert.

use std::collections::HashMap;

fn main() {
    let mut scores: HashMap<String, i32> = HashMap::new();
    scores.insert(String::from("Аня"), 95);
    scores.insert(String::from("Боб"), 80);

    println!("{:?}", scores.get("Аня")); // Some(95)
}

Вывод:

Some(95)

Метод get возвращает Option: Some(&значение), если ключ есть, и None — если нет. Это снова та же идея: отсутствие ключа видно в типе, и его нельзя проигнорировать.

Перебор

По карте удобно итерировать циклом for, получая пары ключ-значение. Порядок обхода не определён — хеш-таблица не хранит порядок вставки.

use std::collections::HashMap;

fn main() {
    let mut ages = HashMap::new();
    ages.insert("Аня", 28);
    ages.insert("Боб", 34);

    let mut total = 0;
    for (name, age) in &ages {
        total += age;
        let _ = name; // используем, чтобы не было предупреждения
    }
    println!("суммарный возраст: {total}");
}

Вывод:

суммарный возраст: 62

Обновление и значение по умолчанию

Частая задача — «взять текущее значение или вставить начальное». Для этого есть entry().or_insert(...): он возвращает изменяемую ссылку на значение, создавая его, если ключа ещё нет. Классический пример — подсчёт частот.

use std::collections::HashMap;

fn main() {
    let text = "a b a c b a";
    let mut counts: HashMap<&str, i32> = HashMap::new();

    for word in text.split_whitespace() {
        // если ключа нет — вставит 0, затем вернёт ссылку; прибавляем 1
        let counter = counts.entry(word).or_insert(0);
        *counter += 1;
    }

    println!("a встречается {} раз", counts["a"]);
    println!("b встречается {} раз", counts["b"]);
}

Вывод:

a встречается 3 раз
b встречается 2 раз

Полезные методы

МетодЧто делает
insert(k, v)добавить или заменить значение по ключу
get(&k)получить Option<&V>
contains_key(&k)есть ли ключ
remove(&k)удалить пару по ключу
entry(k).or_insert(d)получить или создать значение

Итог

  • HashMap<K, V> хранит пары ключ-значение с быстрым доступом; импортируется из std::collections.
  • get возвращает Option — отсутствие ключа видно в типе.
  • entry().or_insert() — идиома «взять или создать», удобна для счётчиков.
Проверьте себя
1. Что возвращает метод get у HashMap?
AСамо значение всегда
BOption: Some(&значение), если ключ есть, иначе None
CОшибку, если ключа нет
DЛогическое значение
2. Зачем используют entry(k).or_insert(d)?
AЧтобы удалить ключ
BЧтобы получить значение по ключу или создать его со значением d, если ключа нет
CЧтобы отсортировать карту
DЧтобы проверить тип
3. Гарантирует ли HashMap порядок обхода пар?
AДа, порядок вставки
BНет, порядок обхода не определён
CДа, по алфавиту
DДа, по значению
Поддержать проект