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

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