Итерация по 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);
}Есть одна важная деталь, о которой стоит помнить: хеш-карты не гарантируют определенного порядка итерации. Пары могут выводиться в разной последовательности при каждом запуске программы. Это связано с тем, что хеш-карты отдают приоритет быстрому поиску, а не сохранению порядка вставки, поэтому не полагайтесь на то, что элементы будут появляться в какой-то определенной последовательности при итерации.
Задание
ЛегкоВы получите целое число 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: Итерировать по хеш-карте и вывести имя и оценку каждого студента
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элемента