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ó.
Desafio
FácilLeia duas linhas de entrada:
- Uma lista de inteiros separados por vírgula, os
nums - Uma lista de inteiros separados por vírgula, os
repeats(mesmo comprimento quenums)
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 ","
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
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de Palavras3Dicionários
Declarando DicionáriosBusca OpcionalAtualizando DicionáriosIterando DicionáriosAgrupando ValoresRecapitulação - Inventário6Funções de Ordem Superior Parte 2
compactMapflatMapsorted(by:)Construindo PipelinesRecapitulação - Leaderboard