Удаление элемента из множества
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 35 из 68.
Иногда нужно удалять элементы из множества, и в Go это просто сделать с помощью встроенной функции delete(). Поскольку в основе множества на самом деле лежит map, удаление элемента работает точно так же, как удаление ключа из map.
Чтобы удалить элемент из множества, используйте функцию delete(), передав ей множество и элемент, который вы хотите удалить:
delete(colors, "red")Функция delete() принимает два параметра: отображение (ваше множество) и ключ, который вы хотите удалить. Если элемент есть в множестве, он удаляется. Если элемента нет, функция ничего не делает — ошибка не возникает.
Такое поведение идеально подходит для множеств, поскольку часто нужно убедиться, что элемент отсутствует, независимо от того, был ли он там изначально. Операция выполняется быстро и эффективно, сохраняя преимущества производительности, обеспечиваемые базовой реализацией отображения в Go.
Задание
ЛегкоСоздай систему управления библиотечными книгами, которая удаляет книги из коллекций разных жанров, используя идиоматический для Go подход с множествами. В этом задании показано, как использовать функцию delete() для удаления элементов из множеств и отслеживания процесса удаления.
Ты получишь два входных значения:
- Строку со списком книг из коллекции художественной литературы, разделённых запятыми (например,
"1984,Dune,Foundation,Neuromancer,Brave New World") - Строку со списком книг для удаления, разделённых запятыми (например,
"Dune,Harry Potter,Foundation,Twilight,1984")
Твоя задача:
- Создать множество для хранения книг из коллекции художественной литературы, используя идиоматичную для Go конструкцию
map[string]struct{} - Разобрать первую входную строку, разделив её по запятым, чтобы получить названия отдельных книг
- Добавить каждую книгу в множество, используя литерал пустой структуры
{}в качестве значения - Разобрать вторую входную строку, разделив её по запятым, чтобы получить список книг для удаления
- Для каждой книги, которую нужно удалить, проверить, есть ли она в множестве, используя идиому с запятой и ok
- Вывести результат обработки каждой книги:
- Если книга есть в коллекции:
"Removing: [book_title]" - Если книги нет в коллекции:
"Not found: [book_title]"
- Если книга есть в коллекции:
- Использовать функцию
delete(), чтобы удалить книги, которые есть в множестве - После обработки всех запросов на удаление вывести сводку:
"Initial collection size: [initial_count]""Removal requests: [requests_count]""Books successfully removed: [removed_count]""Books not found: [not_found_count]""Final collection size: [final_count]"
- Наконец, вывести список всех оставшихся в коллекции книг:
- Заголовок:
"Remaining books in fiction collection:" - Каждая книга на отдельной строке:
"- [book_title]" - Если книг не осталось:
"- Collection is empty"
- Заголовок:
Используй пакет strings, чтобы разделить входные строки по запятым. В этом задании показано, как функция delete() безопасно удаляет элементы из множества Go: ошибок не возникает, даже если попытаться удалить несуществующий элемент, поэтому этот способ отлично подходит для операций очистки.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// Считывайте ввод с помощью Scanner, чтобы поддерживать названия книг с пробелами
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
fictionBooks := scanner.Text()
scanner.Scan()
booksToRemove := scanner.Text()
// Разберите входные строки
fictionList := strings.Split(fictionBooks, ",")
removeList := strings.Split(booksToRemove, ",")
// TODO: Напишите свой код ниже
// 1. Создайте множество с помощью map[string]struct{} для хранения художественных книг
// 2. Добавьте каждую книгу из fictionList в множество
// 3. Обработайте каждую книгу из removeList и проверьте, есть ли она в множестве
// 4. Отобразите процесс удаления и используйте функцию delete()
// 5. Выведите итоговую статистику
// 6. Выведите список книг, оставшихся в коллекции
// Не забудьте отсортировать оставшиеся книги для единообразного вывода
_ = sort.Strings // удалите эту строку, когда начнёте использовать sort
_ = fmt.Println // удалите эту строку, когда начнёте использовать fmt
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведение6Идиоматический Go: множества
Идиома множества в GoСоздание множестваДобавление элементов в множествоПроверка наличия элементаУдаление элемента из множестваПеребор элементов множестваПовторение — уникальные имена пользователейПотренируйтесь самостоятельно: Онлайн-компилятор Go