Menu
Coddy logo textTech

sorted(by:)

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

Você usou .sorted() em arrays de valores Comparable, como números ou strings. Quando você quiser ordenar por outra coisa, forneça um closure que receba dois elementos e retorne true quando o primeiro deve vir antes do segundo.

let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
print(byLength)              // ["hi", "hello", "banana"]

Para ordem decrescente, inverta a comparação:

let down = words.sorted { $0.count > $1.count }
print(down)                  // ["banana", "hello", "hi"]

O closure pode comparar qualquer valor derivado, comprimento, última letra, uma entrada em um hash. O que quer que o closure compare decide a ordenação.

min(by:) e max(by:) funcionam da mesma maneira, mas retornam um único elemento opcional em vez de uma cópia ordenada.

challenge icon

Desafio

Médio

Leia uma única linha de entrada: uma lista separada por vírgulas de pares name:age.

Imprima três linhas:

  1. Nomes ordenados por idade em ordem crescente, unidos por ,. Resolva empates ordenando os nomes empatados em ordem alfabética.
  2. O nome da pessoa mais velha (use max(by:)). Em caso de empate, vence aquele que aparecer primeiro.
  3. O nome da pessoa mais nova (use min(by:)). Em caso de empate, vence aquele que aparecer primeiro.

Para a entrada alice:30,bob:22,cara:30,dan:18, a saída é:

dan,bob,alice,cara
alice
dan

Folha de consulta

Use .sorted { } com um closure personalizado para ordenar por qualquer valor derivado. O closure recebe dois elementos e retorna true quando o primeiro deve vir antes do segundo:

let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
// ["hi", "hello", "banana"]

Para ordem decrescente, troque o operador:

let down = words.sorted { $0.count > $1.count }
// ["banana", "hello", "hi"]

min(by:) e max(by:) usam a mesma assinatura de closure, mas retornam um único elemento opcional:

let longest = words.max(by: { $0.count < $1.count })  // "banana"
let shortest = words.min(by: { $0.count < $1.count }) // "hi"

Experimente você mesmo

let people = readLine()!.components(separatedBy: ",").map { pair -> (String, Int) in
    let parts = pair.components(separatedBy: ":")
    return (parts[0], Int(parts[1])!)
}

// TODO: ordenar por idade crescente (desempate por nome); max(by:) para o mais velho; min(by:) para o mais novo
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