flatMap
Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 29 de 56.
flatMap es para el caso en el que cada elemento produce varios resultados. El closure devuelve un array; flatMap concatena todos ellos en un único array plano.
let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]También puedes realizar trabajo real dentro del cierre. Mapear cada valor a un array pequeño y aplanar el resultado en un solo paso es el 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]Compara con map: eso habría producido un [[Int]], un array de arrays pequeños, lo cual requeriría otro paso para aplanar. flatMap combina esos dos pasos en uno solo.
Desafío
FácilLee dos líneas de entrada:
- Una lista de enteros separados por comas, los
nums - Una lista de enteros separados por comas, los
repeats(de la misma longitud quenums)
Para cada i, repite nums[i] exactamente repeats[i] veces. Imprime el array plano resultante, unido con ,. Usa flatMap.
Para la entrada 5,7,2 en la línea 1 y 3,1,2 en la línea 2, la salida es 5,5,5,7,2,2.
Hoja de referencia
flatMap mapea cada elemento a un array y concatena todos los resultados en un único array plano:
let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]A diferencia de map (que produciría [[Int]]), flatMap aplana en un solo paso. También puede aplanar arrays anidados directamente:
let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]Pruébalo tú mismo
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let repeats = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: aplicar flatMap a cada (num, repeat) en Array(repeating:count:); unir con ","
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Strings a fondo
Conteo e índicesMayúsculas, minúsculas y TrimBúsqueda en StringsDividir y unirReemplazo de subcadenasResumen: Validación de usuario4Conjuntos
Crear conjuntosUnión e intersecciónResta y diferencia simétricaSubconjunto y superconjuntoResumen - Filtro de etiquetas7Proyecto - Seguimiento de hábitos
Descripción general del proyectoMarcar como completado10Proyecto - Motor de cuestionarios
Descripción general del proyectoHacer preguntas2Rangos e Intervalos
Cerrados vs. SemiabiertosSaltos (Stride)Métodos de RangosRangos en SwitchResumen - Cuadrícula de calendario5Funciones de orden superior Pt. 1
MapFilterReduceEncadenar map, filter, reduceResumen - Estadísticas de palabras3Diccionarios
Declaración de diccionariosBúsqueda opcionalActualización de diccionariosIteración de diccionariosAgrupación de valoresResumen - Inventario6Funciones de orden superior - Parte 2
compactMapflatMapsorted(by:)Construcción de pipelinesRepaso - Tabla de posiciones