Menu
Coddy logo textTech

flatMap

Parte da seção Lógica e Fluxo do Journey de Swift da Coddy — lição 29 de 56.

flatMap é para o caso em que cada elemento produz vários resultados. O closure retorna um array; flatMap concatena todos eles em um único array plano.

let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all)                       // [1, 2, 3, 4, 5, 6]

Você também pode realizar trabalho real dentro do closure. Mapear cada valor para um pequeno array e achatar o resultado em uma única etapa é o caso de uso típico:

let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs)                     // [1, 1, 2, 4, 3, 9]

Compare com map: isso teria produzido um [[Int]], um array de pequenos arrays, que você precisaria de mais um passo para achatar. flatMap combina esses dois passos em um só.

challenge icon

Desafio

Fácil

Leia duas linhas de entrada:

  1. Uma lista de inteiros separados por vírgula, os nums
  2. Uma lista de inteiros separados por vírgula, os repeats (mesmo comprimento que nums)

Para cada i, repita nums[i] exatamente repeats[i] vezes. Imprima o array plano resultante, unido com ,. Use flatMap.

Para a entrada 5,7,2 na linha 1 e 3,1,2 na linha 2, a saída é 5,5,5,7,2,2.

Folha de consulta

flatMap mapeia cada elemento para um array e concatena todos os resultados em um único array plano:

let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]

Diferente do map (que produziria [[Int]]), o flatMap achata em um único passo. Ele também pode achatar arrays aninhados diretamente:

let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]

Experimente você mesmo

let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let repeats = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: flatMap cada (num, repeat) em Array(repeating:count:); unir com ","
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo