Menu
Coddy logo textTech

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 объединяет эти два шага в один.

challenge icon

Задание

Легко

Прочитайте две строки входных данных:

  1. Список целых чисел, разделенных запятыми, — nums
  2. Список целых чисел, разделенных запятыми, — 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:); объедините через ","
quiz iconПроверьте себя

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

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