Обновление значения
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 32 из 66.
Иногда вам нужно обновлять значения в хеш-карте различными способами. Вы уже узнали, что .insert() перезапишет существующее значение, но что, если вы хотите добавить значение только в том случае, если ключ еще не существует?
Rust предоставляет API .entry() для более сложных обновлений значений. Самым полезным методом в этом API является .or_insert(), который вставляет значение только в том случае, если ключ еще не представлен:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// Это НЕ перезапишет значение для Alice
scores.entry("Alice").or_insert(90);
// Это ДОБАВИТ значение для Bob, так как его нет в хеш-таблице
scores.entry("Bob").or_insert(90);Метод .entry() возвращает перечисление Entry, которое представляет собой либо занятое, либо свободное место в хеш-карте. Когда вы вызываете на нем .or_insert(), он вставляет новое значение только в том случае, если запись пуста (ключ не существует).
Задание
ЛегкоВы получите целое число n, указывающее количество имен игроков для обработки. Затем вы получите n имен игроков в качестве входных данных. Создайте хеш-карту для отслеживания очков игроков (тип HashMap<String, i32>). Для каждого полученного имени игрока используйте .entry() с .or_insert(), чтобы добавить их в карту с начальным счетом 100 только в том случае, если они еще не существуют. После обработки всех имен выведите каждого игрока и его счет.
Требования:
- Импортируйте
HashMapизstd::collections - Создайте изменяемую хеш-карту с типами
HashMap<String, i32> - Прочитайте первый ввод и преобразуйте его в
i32, чтобы получить количество имен игроков - Используйте цикл для чтения
nимен игроков - Для каждого имени игрока используйте
.entry(name).or_insert(100), чтобы добавить их со счетом100, если их еще нет в карте - После обработки всех имен переберите хеш-карту и выведите информацию о каждом игроке в формате:
[name]: [score]
Ввод:
- Первая строка: Целое число
n(например,5) - Следующие
nстрок: Имена игроков (например,Alice,Bob,Alice,Charlie,Bob)
Вывод:
- Одна строка для каждого уникального игрока в формате:
[name]: [score] - Порядок строк вывода может меняться от запуска к запуску
Шпаргалка
API .entry() предоставляет продвинутые способы обновления значений в хэш-карте. Метод .or_insert() вставляет значение только в том случае, если ключ еще не существует:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// Это НЕ перезапишет результат Alice
scores.entry("Alice").or_insert(90);
// Это ДОБАВИТ результат Bob, так как его нет в карте
scores.entry("Bob").or_insert(90);Метод .entry() возвращает перечисление Entry, представляющее либо занятое, либо свободное место в хэш-карте. Когда вы вызываете .or_insert(), он вставляет новое значение только в том случае, если запись свободна (ключ не существует).
Попробуйте сами
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();
// Создать изменяемый HashMap для хранения очков игроков
let mut player_scores: HashMap<String, i32> = HashMap::new();
// TODO: Напишите ваш код ниже
// Прочитайте n имен игроков и используйте .entry().or_insert(100), чтобы добавить их в карту
// Вывести каждого игрока и его очки в формате: [имя]: [очки]
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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Итоги: поиск элемента