sorted(by:)
Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 30 de 56.
Has usado .sorted() en arrays de valores Comparable como números o cadenas. Cuando quieras ordenar por algo más, proporciona un cierre (closure) que tome dos elementos y devuelva true cuando el primero deba ir antes que el segundo.
let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
print(byLength) // ["hi", "hello", "banana"]Para el orden descendente, intercambia la comparación:
let down = words.sorted { $0.count > $1.count }
print(down) // ["banana", "hello", "hi"]El closure puede comparar cualquier valor derivado, longitud, última letra, una entrada en un hash. Lo que sea que el closure compare decide el ordenamiento.
min(by:) y max(by:) funcionan de la misma manera pero devuelven un único elemento opcional en lugar de una copia ordenada.
Desafío
IntermedioLee una sola línea de entrada: una lista separada por comas de pares name:age.
Imprime tres líneas:
- Nombres ordenados por edad de forma ascendente, unidos con
,. Rompe los empates ordenando los nombres empatados alfabéticamente. - El nombre de la persona más vieja (usa
max(by:)). En caso de empate, gana la que aparece primero. - El nombre de la persona más joven (usa
min(by:)). En caso de empate, gana la que aparece primero.
Para la entrada alice:30,bob:22,cara:30,dan:18, la salida es:
dan,bob,alice,cara
alice
danHoja de referencia
Usa .sorted { } con una clausura personalizada para ordenar por cualquier valor derivado. La clausura toma dos elementos y devuelve true cuando el primero debe ir antes que el segundo:
let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
// ["hi", "hello", "banana"]Para el orden descendente, intercambia el operador:
let down = words.sorted { $0.count > $1.count }
// ["banana", "hello", "hi"]min(by:) y max(by:) usan la misma firma de clausura pero devuelven un único elemento opcional:
let longest = words.max(by: { $0.count < $1.count }) // "banana"
let shortest = words.min(by: { $0.count < $1.count }) // "hi"Pruébalo tú mismo
let people = readLine()!.components(separatedBy: ",").map { pair -> (String, Int) in
let parts = pair.components(separatedBy: ":")
return (parts[0], Int(parts[1])!)
}
// TODO: ordenar por edad asc (desempate por nombre); max(by:) para el mayor; min(by:) para el menor
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