Menu
Coddy logo textTech

Итерация по Hash Map

Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 31 из 66.

Иногда вам нужно просмотреть каждую пару «ключ-значение» в вашем хеш-отображении (hash map), а не искать конкретные ключи. Rust предоставляет простой способ перебора всех данных с помощью цикла for:

for (key, value) in &my_map {
    println!("{}: {}", key, value);
}

Обратите внимание на & перед my_map — это создает ссылку на хеш-карту, чтобы вы могли выполнять итерацию без передачи владения. Цикл предоставляет каждую пару «ключ-значение» в виде кортежа, который вы можете деструктурировать непосредственно в объявлении цикла.

Вот практический пример со списком цен:

let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);

for (item, price) in &prices {
    println!("{} costs ${:.2}", item, price);
}

Есть одна важная деталь, о которой стоит помнить: хеш-карты не гарантируют определенного порядка итерации. Пары могут выводиться в разной последовательности при каждом запуске программы. Это связано с тем, что хеш-карты отдают приоритет быстрому поиску, а не сохранению порядка вставки, поэтому не полагайтесь на то, что элементы будут появляться в какой-то определенной последовательности при итерации.

challenge icon

Задание

Легко

Вы получите целое число n, указывающее количество пар «студент-оценка» для обработки. Затем вы получите n пар входных данных: имя студента, за которым следует его тестовый балл (в виде целого числа). Создайте хеш-карту (hash map) для хранения имен студентов в качестве ключей и их оценок в качестве значений. После вставки всех пар переберите хеш-карту и выведите имя и оценку каждого студента.

Требования:

  • Импортируйте HashMap из std::collections
  • Создайте изменяемую хеш-карту с типами HashMap<String, i32>
  • Прочитайте первый входной параметр и преобразуйте его в i32, чтобы получить количество пар
  • Используйте цикл для чтения n пар входных данных (имя студента, затем оценка)
  • Вставьте имя и оценку каждого студента в хеш-карту
  • Используйте цикл for для итерации по хеш-карте с помощью &map
  • Выведите информацию о каждом студенте в формате: [name]: [score]
  • Выводите пары в любом порядке (хеш-карты не гарантируют порядок)

Ввод:

  • Первая строка: целое число n (например, 3)
  • Следующие n пар строк:
    • Имя студента (например, Alice)
    • Тестовый балл в виде целого числа (например, 95)

Вывод:

  • По одной строке для каждого студента в формате: [name]: [score]
  • Порядок строк вывода может меняться между запусками тестов

Шпаргалка

Чтобы перебрать все пары «ключ-значение» в хеш-карте, используйте цикл for со ссылкой на карту:

for (key, value) in &my_map {
    println!("{}: {}", key, value);
}

Символ & перед хеш-картой создает ссылку, позволяя выполнять итерацию без передачи владения. Цикл деструктурирует каждую пару «ключ-значение» как кортеж.

Пример с хеш-картой:

let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);

for (item, price) in &prices {
    println!("{} costs ${:.2}", item, price);
}

Важно: Хеш-карты не гарантируют определенного порядка итерации. Пары могут появляться в разной последовательности при каждом запуске программы, так как хеш-карты отдают приоритет быстрому поиску, а не сохранению порядка вставки.

Попробуйте сами

use std::collections::HashMap;
use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // Прочитать количество пар студент-оценка
    let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
    
    // Создать изменяемую хеш-карту для хранения имен студентов и их оценок
    let mut students: HashMap<String, i32> = HashMap::new();
    
    // TODO: Напишите свой код ниже
    // Прочитать n пар входных данных (имя студента и оценка) и вставить их в хеш-карту
    
    
    
    // TODO: Итерировать по хеш-карте и вывести имя и оценку каждого студента
    
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow