Menu
CoddyTech

Удаление элемента из множества

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

Иногда нужно удалять элементы из множества, и в Go это просто сделать с помощью встроенной функции delete(). Поскольку в основе множества на самом деле лежит map, удаление элемента работает точно так же, как удаление ключа из map.

Чтобы удалить элемент из множества, используйте функцию delete(), передав ей множество и элемент, который вы хотите удалить:

delete(colors, "red")

Функция delete() принимает два параметра: отображение (ваше множество) и ключ, который вы хотите удалить. Если элемент есть в множестве, он удаляется. Если элемента нет, функция ничего не делает — ошибка не возникает.

Такое поведение идеально подходит для множеств, поскольку часто нужно убедиться, что элемент отсутствует, независимо от того, был ли он там изначально. Операция выполняется быстро и эффективно, сохраняя преимущества производительности, обеспечиваемые базовой реализацией отображения в Go.

challenge icon

Задание

Легко

Создай систему управления библиотечными книгами, которая удаляет книги из коллекций разных жанров, используя идиоматический для Go подход с множествами. В этом задании показано, как использовать функцию delete() для удаления элементов из множеств и отслеживания процесса удаления.

Ты получишь два входных значения:

  • Строку со списком книг из коллекции художественной литературы, разделённых запятыми (например, "1984,Dune,Foundation,Neuromancer,Brave New World")
  • Строку со списком книг для удаления, разделённых запятыми (например, "Dune,Harry Potter,Foundation,Twilight,1984")

Твоя задача:

  1. Создать множество для хранения книг из коллекции художественной литературы, используя идиоматичную для Go конструкцию map[string]struct{}
  2. Разобрать первую входную строку, разделив её по запятым, чтобы получить названия отдельных книг
  3. Добавить каждую книгу в множество, используя литерал пустой структуры {} в качестве значения
  4. Разобрать вторую входную строку, разделив её по запятым, чтобы получить список книг для удаления
  5. Для каждой книги, которую нужно удалить, проверить, есть ли она в множестве, используя идиому с запятой и ok
  6. Вывести результат обработки каждой книги:
    • Если книга есть в коллекции: "Removing: [book_title]"
    • Если книги нет в коллекции: "Not found: [book_title]"
  7. Использовать функцию delete(), чтобы удалить книги, которые есть в множестве
  8. После обработки всех запросов на удаление вывести сводку:
    • "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]"
  9. Наконец, вывести список всех оставшихся в коллекции книг:
    • Заголовок: "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
}
quiz iconПроверьте себя

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

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

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