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.
Desafio
MédioLeia uma única linha de entrada: uma lista separada por vírgulas de pares name:age.
Imprima três linhas:
- Nomes ordenados por idade em ordem crescente, unidos por
,. Resolva empates ordenando os nomes empatados em ordem alfabética. - O nome da pessoa mais velha (use
max(by:)). Em caso de empate, vence aquele que aparecer primeiro. - 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
danFolha 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
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
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de Palavras3Dicionários
Declarando DicionáriosBusca OpcionalAtualizando DicionáriosIterando DicionáriosAgrupando ValoresRecapitulação - Inventário6Funções de Ordem Superior Parte 2
compactMapflatMapsorted(by:)Construindo PipelinesRecapitulação - Leaderboard