flatMap
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 29 von 56.
flatMap ist für den Fall gedacht, in dem jedes Element mehrere Ergebnisse liefert. Der Closure gibt ein Array zurück; flatMap verkettet alle zu einem einzigen flachen Array.
let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]Sie können auch innerhalb des Closures echte Arbeit verrichten. Das Mapping jedes Wertes auf ein kleines Array und das Glätten des Ergebnisses in einem Schritt ist der typische Anwendungsfall:
let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]Vergleichen Sie dies mit map: das hätte ein [[Int]] erzeugt, ein Array aus kleinen Arrays, für das Sie einen weiteren Schritt zum Glätten benötigen würden. flatMap fasst diese beiden Schritte in einem zusammen.
Aufgabe
EinfachLies zwei Zeilen Eingabe ein:
- Eine durch Kommas getrennte Liste von Ganzzahlen, die
nums - Eine durch Kommas getrennte Liste von Ganzzahlen, die
repeats(gleiche Länge wienums)
Wiederhole für jedes i den Wert nums[i] genau repeats[i] Mal. Gib das resultierende flache Array aus, verbunden mit ,. Verwende flatMap.
Für die Eingabe 5,7,2 in Zeile 1 und 3,1,2 in Zeile 2 lautet die Ausgabe 5,5,5,7,2,2.
Spickzettel
flatMap bildet jedes Element auf ein Array ab und verkettet alle Ergebnisse zu einem einzigen flachen Array:
let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]Im Gegensatz zu map (was [[Int]] erzeugen würde), flacht flatMap in einem Schritt ab. Es kann auch verschachtelte Arrays direkt abflachen:
let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]Probier es selbst
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let repeats = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: flatMap jedes (num, repeat) in Array(repeating:count:); mit "," verbinden
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