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.
Défi
MoyenLisez une seule ligne d'entrée : une liste de paires name:age séparées par des virgules.
Affichez trois lignes :
- Les noms triés par âge croissant, joints par
,. En cas d'égalité, triez les noms concernés par ordre alphabétique. - Le nom de la personne la plus âgée (utilisez
max(by:)). En cas d'égalité, celle qui apparaît en premier l'emporte. - 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
danAide-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
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
1Les chaînes de caractères en profondeur
Comptage et indicesCasse et nettoyageRecherche dans les chaînesDécoupage et jointureRemplacement de sous-chaînesRécapitulatif - Vérification du nom d'utilisateur4Ensembles
Création d'ensemblesUnion et intersectionSoustraction et différence symétriqueSous-ensemble et sur-ensembleRécapitulatif - Filtre de tags7Projet - Suivi d'habitudes
Aperçu du projetMarquer comme terminé10Projet - Moteur de quiz
Présentation du projetPoser des questions2Intervalles et Pas
Fermé vs Semi-ouvertLe PasMéthodes d'intervalleIntervalles dans un SwitchRécapitulatif - Grille de calendrier5Fonctions d'ordre supérieur, Partie 1
MapFilterReduceChaînage de map, filter, reduceRécapitulatif - Statistiques de mots3Dictionnaires
Déclarer des dictionnairesRecherche optionnelleMettre à jour des dictionnairesParcourir des dictionnairesGrouper des valeursRécapitulatif - Inventaire6Fonctions d'ordre supérieur, partie 2
compactMapflatMapsorted(by:)Construction de pipelinesRécapitulatif - Tableau de classement