Menu
Coddy logo textTech

sorted(by:)

Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 30 sur 56.

Vous avez utilisé .sorted() sur des tableaux de valeurs Comparable comme des nombres ou des chaînes de caractères. Lorsque vous voulez trier par autre chose, fournissez une closure qui prend deux éléments et renvoie true quand le premier doit se placer avant le second.

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

Pour l'ordre décroissant, inversez la comparaison :

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

La closure peut comparer n'importe quelle valeur dérivée, la longueur, la dernière lettre, une entrée dans un hachage. Ce que la closure compare décide du tri.

min(by:) et max(by:) fonctionnent de la même manière mais renvoient un seul élément optionnel plutôt qu'une copie triée.

challenge icon

Défi

Moyen

Lisez une seule ligne d'entrée : une liste de paires name:age séparées par des virgules.

Affichez trois lignes :

  1. Les noms triés par âge croissant, joints par ,. En cas d'égalité, triez les noms concernés par ordre alphabétique.
  2. Le nom de la personne la plus âgée (utilisez max(by:)). En cas d'égalité, celle qui apparaît en premier l'emporte.
  3. Le nom de la personne la plus jeune (utilisez min(by:)). En cas d'égalité, celle qui apparaît en premier l'emporte.

Pour l'entrée alice:30,bob:22,cara:30,dan:18, la sortie est :

dan,bob,alice,cara
alice
dan

Aide-mémoire

Utilisez .sorted { } avec une fermeture (closure) personnalisée pour trier par n'importe quelle valeur dérivée. La fermeture prend deux éléments et renvoie true lorsque le premier doit précéder le second :

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

Pour un ordre décroissant, inversez l'opérateur :

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

min(by:) et max(by:) utilisent la même signature de fermeture mais renvoient un seul élément optionnel :

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

Essayez vous-même

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

// TODO: trier par âge croissant (départager par nom) ; max(by:) pour le plus âgé ; min(by:) pour le plus jeune
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux