flatMap
Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 29 из 56.
flatMap предназначен для случаев, когда каждый элемент производит несколько результатов. Замыкание возвращает массив; flatMap объединяет их все в один плоский массив.
let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]Внутри замыкания также можно выполнять реальную работу. Типичным примером использования является отображение каждого значения в небольшой массив и объединение результата в один шаг:
let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]Сравните с map: это привело бы к созданию [[Int]], массива из маленьких массивов, для выравнивания которого потребовался бы еще один шаг. flatMap объединяет эти два шага в один.
Задание
ЛегкоПрочитайте две строки входных данных:
- Список целых чисел, разделенных запятыми, —
nums - Список целых чисел, разделенных запятыми, —
repeats(той же длины, что иnums)
Для каждого i повторите nums[i] ровно repeats[i] раз. Выведите результирующий плоский массив, объединенный через ,. Используйте flatMap.
Для входных данных 5,7,2 в строке 1 и 3,1,2 в строке 2 результатом будет 5,5,5,7,2,2.
Шпаргалка
flatMap преобразует каждый элемент в массив и объединяет все результаты в один плоский массив:
let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]В отличие от map (который создал бы [[Int]]), flatMap выполняет сглаживание за один шаг. Он также может напрямую сглаживать вложенные массивы:
let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]Попробуйте сами
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let repeats = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: примените flatMap к каждой паре (num, repeat) в Array(repeating:count:); объедините через ","
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря3Словари
Объявление словарейБезопасный поискОбновление словарейИтерация по словарямГруппировка значенийИтоги — Инвентарь6Функции высшего порядка, часть 2
compactMapflatMapsorted(by:)Создание конвейеровПовторение — Таблица лидеров