sorted(by:)
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 30 von 56.
Sie haben .sorted() für Arrays von Comparable-Werten wie Zahlen oder Strings verwendet. Wenn Sie nach etwas anderem sortieren möchten, geben Sie einen Closure an, der zwei Elemente entgegennimmt und true zurückgibt, wenn das erste vor dem zweiten stehen soll.
let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
print(byLength) // ["hi", "hello", "banana"]Für eine absteigende Sortierung kehren Sie den Vergleich um:
let down = words.sorted { $0.count > $1.count }
print(down) // ["banana", "hello", "hi"]Der Closure kann jeden abgeleiteten Wert, die Länge, den letzten Buchstaben oder einen Eintrag in einem Hash vergleichen. Was auch immer der Closure vergleicht, entscheidet über die Sortierung.
min(by:) und max(by:) funktionieren auf die gleiche Weise, geben aber ein einzelnes optionales Element anstelle einer sortierten Kopie zurück.
Aufgabe
MittelLies eine einzelne Eingabezeile: eine durch Kommas getrennte Liste von name:age-Paaren.
Gib drei Zeilen aus:
- Namen sortiert nach Alter aufsteigend, verbunden mit
,. Löse Gleichstände auf, indem du die betroffenen Namen alphabetisch sortierst. - Der Name der ältesten Person (verwende
max(by:)). Bei einem Gleichstand gewinnt die Person, die zuerst erscheint. - Der Name der jüngsten Person (verwende
min(by:)). Bei einem Gleichstand gewinnt die Person, die zuerst erscheint.
Für die Eingabe alice:30,bob:22,cara:30,dan:18 lautet die Ausgabe:
dan,bob,alice,cara
alice
danSpickzettel
Verwenden Sie .sorted { } mit einem benutzerdefinierten Closure, um nach einem beliebigen abgeleiteten Wert zu sortieren. Das Closure nimmt zwei Elemente entgegen und gibt true zurück, wenn das erste vor dem zweiten stehen sollte:
let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
// ["hi", "hello", "banana"]Für eine absteigende Sortierung tauschen Sie den Operator aus:
let down = words.sorted { $0.count > $1.count }
// ["banana", "hello", "hi"]min(by:) und max(by:) verwenden dieselbe Closure-Signatur, geben aber ein einzelnes optionales Element zurück:
let longest = words.max(by: { $0.count < $1.count }) // "banana"
let shortest = words.min(by: { $0.count < $1.count }) // "hi"Probier es selbst
let people = readLine()!.components(separatedBy: ",").map { pair -> (String, Int) in
let parts = pair.components(separatedBy: ":")
return (parts[0], Int(parts[1])!)
}
// TODO: Nach Alter aufsteigend sortieren (Gleichstand nach Name auflösen); max(by:) für den Ältesten; min(by:) für den Jüngsten
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Kontrollfluss
1Strings im Detail
Zählen und IndizesGroß-/Kleinschreibung und TrimmenSuchen in StringsTeilen und ZusammenfügenTeilstrings ersetzenWiederholung – Benutzernamen-Check4Mengen
Mengen erstellenVereinigung und SchnittmengeDifferenz und symmetrische DifferenzTeilmenge und ObermengeRückblick – Tag-Filter7Projekt - Habit Tracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteRange-MethodenRanges in SwitchRückblick – Kalender-Grid5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerkettung von map, filter, reduceRückblick – Wortstatistiken3Dictionaries
Dictionaries deklarierenOptionaler LookupDictionaries aktualisierenÜber Dictionaries iterierenWerte gruppierenZusammenfassung – Inventar6Funktionen höherer Ordnung Teil 2
compactMapflatMapsorted(by:)Pipelines erstellenZusammenfassung – Bestenliste