Удаление пары
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 33 из 66.
Иногда вам нужно полностью удалить данные из вашей хэш-карты. Rust предоставляет метод .remove() для удаления пары ключ-значение путем указания ключа:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
// Полностью удалить запись "apples"
inventory.remove("apples");Метод .remove() принимает ключ в качестве параметра и удаляет как ключ, так и связанное с ним значение из хеш-карты. После вызова .remove("apples") попытка поиска "apples" вернет None.
Как и многие операции с хеш-картами, .remove() возвращает Option. Он возвращает Some(value), содержащий удалённое значение, если ключ существовал, или None, если ключ не был найден:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}Это возвращаемое значение позволяет узнать, было ли удаление успешным, и предоставляет доступ к удаленному значению, что может быть полезно для логирования или операций очистки.
Задание
ЛегкоВы получите целое число n, указывающее количество товаров в инвентаре. Затем вы получите n пар входных данных: название товара, за которым следует его количество (в виде целого числа). После этого вы получите еще один входной параметр с названием товара, который нужно удалить из инвентаря. Создайте хеш-карту (hash map) для хранения инвентаря, вставьте все товары, удалите указанный товар и выведите результат удаления вместе с оставшимся инвентарем.
Требования:
- Импортируйте
HashMapизstd::collections - Создайте изменяемую хеш-карту с типами
HashMap<String, i32> - Прочитайте первый входной параметр и преобразуйте его в
i32, чтобы получить количество товаров - Используйте цикл для чтения
nпар входных данных (название товара, затем количество) - Вставьте каждый товар и его количество в хеш-карту
- Прочитайте еще один входной параметр как название товара для удаления
- Используйте
.remove()для удаления товара из хеш-карты - Используйте
matchдля обработкиOption, возвращаемого методом.remove() - Если товар был найден и удален, выведите:
Removed [quantity] [item_name] - Если товар не был найден, выведите:
[item_name] not found - После обработки удаления выполните итерацию по оставшейся хеш-карте и выведите каждый товар в формате:
[item_name]: [quantity]
Ввод:
- Первая строка: Целое число
n(например,3) - Следующие
nпар строк:- Название товара (например,
apples) - Количество в виде целого числа (например,
50)
- Название товара (например,
- Последняя строка: Название товара для удаления (например,
bananas)
Вывод:
- Первая строка: Либо
Removed [quantity] [item_name], либо[item_name] not found - Последующие строки: По одной строке для каждого оставшегося товара в формате:
[item_name]: [quantity] - Порядок оставшихся товаров может меняться от запуска к запуску
Шпаргалка
Чтобы удалить пару «ключ-значение» из хеш-карты, используйте метод .remove(), передав ключ в качестве параметра:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
inventory.remove("apples");Метод .remove() возвращает Option: Some(value), если ключ существовал, или None, если он не был найден:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}Попробуйте сами
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 inventory: HashMap<String, i32> = HashMap::new();
// Прочитать n пар входных данных (название предмета и количество)
for _ in 0..n {
let item_name = lines.next().unwrap().unwrap().trim().to_string();
let quantity: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// TODO: Вставить предмет и количество в хеш-карту
}
// Прочитать название предмета для удаления
let item_to_remove = lines.next().unwrap().unwrap().trim().to_string();
// TODO: Удалить предмет из хеш-карты и обработать результат с помощью match
// Вывести результат удаления (либо "Removed [quantity] [item_name]", либо "[item_name] not found")
// TODO: Пройтись по оставшемуся инвентарю и вывести каждый предмет в формате "[item_name]: [quantity]"
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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Итоги: поиск элемента