Menu
Coddy logo textTech

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

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

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

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

delete(colors, "red")

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

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

challenge icon

Задание

Легко

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

Вы получите два входных значения:

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

Ваша задача:

  1. Создать множество, используя идиому Go map[string]struct{}, для хранения книг художественной литературы
  2. Разобрать первую входную строку, разделив ее по запятым, чтобы получить названия отдельных книг
  3. Добавить каждую книгу в ваше множество, используя литерал пустой структуры {} в качестве значения
  4. Разобрать вторую входную строку, разделив ее по запятым, чтобы получить список книг для удаления
  5. Для каждой книги, которую нужно удалить, проверить, существует ли она в множестве, используя идиому comma 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, не выдавая ошибок даже при попытке удалить несуществующие элементы, что делает ее идеальной для операций очистки.

Шпаргалка

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

delete(colors, "red")

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

Это делает delete() идеальной для множеств, так как часто нужно гарантировать отсутствие элемента, независимо от того, был ли он там изначально.

Попробуйте сами

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Проверьте себя

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

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