Menu
Coddy logo textTech

Удаление пары

Часть раздела 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"),
}

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

challenge icon

Задание

Легко

Вы получите целое число 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]"
}
quiz iconПроверьте себя

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

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