Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lies zwei Zeilen Eingabe ein:

  1. Eine durch Kommas getrennte Liste von Ganzzahlen, die nums
  2. Eine durch Kommas getrennte Liste von Ganzzahlen, die repeats (gleiche Länge wie nums)

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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Kontrollfluss