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

Pratique por conta própria: Playground de Swift