Разность и симметрическая разность
Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 20 из 56.
Еще две операции над множествами завершают этот набор инструментов.
subtracting возвращает элементы первого множества, которых нет во втором:
let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5]
a.subtracting(b) // {1, 2}symmetricDifference возвращает элементы, которые присутствуют ровно в одном из двух множеств, но не в обоих:
a.symmetricDifference(b) // {1, 2, 5}Вместе с union и intersection, эти четыре операции охватывают любой вопрос по алгебре множеств, с которым вы столкнетесь в повседневной практике.
Принадлежность к множеству также полезна в качестве фильтра: проверьте, содержится ли значение в множестве за O(1):
let stopwords: Set = ["the", "a", "an"]
let words = ["the", "cat", "sat", "on", "a", "mat"]
let real = words.filter { !stopwords.contains($0) }
// ["cat", "sat", "on", "mat"]Задание
ЛегкоПрочитайте две строки ввода, каждая из которых представляет собой список строк, разделенных запятыми. Рассматривайте их как currentMembers и renewedMembers соответственно.
Выведите три строки, каждая из которых отсортирована по алфавиту и объединена через , (или пуста, если элементы отсутствуют):
Lapsed: <...>> current минус renewedNew: <...>> renewed минус currentStayed: <...>> пересечение этих двух списков
Для ввода alice,bob,cara в строке 1 и bob,cara,dan в строке 2, вывод будет следующим:
Lapsed: alice
New: dan
Stayed: bob,caraШпаргалка
subtracting возвращает элементы первого множества, не входящие во второе:
let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5]
a.subtracting(b) // {1, 2}symmetricDifference возвращает элементы, которые присутствуют ровно в одном из двух множеств:
a.symmetricDifference(b) // {1, 2, 5}Используйте множество в качестве фильтра со сложностью O(1) с помощью contains:
let stopwords: Set = ["the", "a", "an"]
let words = ["the", "cat", "sat", "on", "a", "mat"]
let real = words.filter { !stopwords.contains($0) }
// ["cat", "sat", "on", "mat"]Попробуйте сами
let current = Set(readLine()!.components(separatedBy: ","))
let renewed = Set(readLine()!.components(separatedBy: ","))
// TODO: вывести Lapsed (current - renewed), New (renewed - current), Stayed (пересечение)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря