Menu
Coddy logo textTech

Разность и симметрическая разность

Часть раздела Логика и управление потоком путешествия по 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"]
challenge icon

Задание

Легко

Прочитайте две строки ввода, каждая из которых представляет собой список строк, разделенных запятыми. Рассматривайте их как currentMembers и renewedMembers соответственно.

Выведите три строки, каждая из которых отсортирована по алфавиту и объединена через , (или пуста, если элементы отсутствуют):

  1. Lapsed: <...> > current минус renewed
  2. New: <...> > renewed минус current
  3. Stayed: <...> > пересечение этих двух списков

Для ввода 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 (пересечение)
quiz iconПроверьте себя

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

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