Menu
Coddy logo textTech

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.

challenge icon

Desafío

Intermedio

Lee una sola línea de entrada: una lista separada por comas de pares name:age.

Imprime tres líneas:

  1. Nombres ordenados por edad de forma ascendente, unidos con ,. Rompe los empates ordenando los nombres empatados alfabéticamente.
  2. El nombre de la persona más vieja (usa max(by:)). En caso de empate, gana la que aparece primero.
  3. 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
dan

Hoja 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
quiz iconPonte a prueba

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