Menu
Coddy logo textTech

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

Часть раздела Логика и управление потоком путешествия по Rust на Coddy. Урок 31 из 66.

Иногда нужно просмотреть каждую пару ключ-значение в вашей хеш-таблице, а не искать определённые ключи. 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);
}

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

challenge icon

Задание

Легко

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

Требования:

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

Ввод:

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

Вывод:

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

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

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Проверьте себя

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

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Rust