Gibt es in Swift ein Gegenstück zu flatten
Scala, Xtend, Groovy, Ruby und Co.?
var aofa = [[1,2,3],[4],[5,6,7,8,9]]
aofa.flatten() // shall deliver [1,2,3,4,5,6,7,8,9]
Natürlich könnte ich dafür Reduzieren verwenden, aber das ist irgendwie scheiße
var flattened = aofa.reduce(Int[]()){
a,i in var b : Int[] = a
b.extend(i)
return b
}
Antworten:
Swift> = 3.0
reduce
::flatMap
::joined
::quelle
flatMap
ist ab Swift 1.2 verfügbar.joined
(formal bekannt alsflatten
) mitflatMap
? Ist es so, dass es während desflatMap
Beitritts auch Dinge abbilden / transformieren kann? aber hier im Beispiel brauchen wir wirklich nicht, dh wir kehren zurück$0
flatMap
wird entweder ein 2D - Array in ein 1D - Array abzuflachen oder Entfernennil
Werte, nicht beide. Es bestimmt, was zu tun ist, basierend darauf, ob das Array der ersten EbeneElement
ein Array oder optional ist. Wenn Sie also ein 2D-Array mit Optionen übergeben (z. B.[[Int?]]
) , wird es auf 1D (z[Int?]
. B. ) reduziert . Um beide auf 1-D zu reduzieren und Nullen der 2. Ebene zu entfernen, müssten Sie dies tunarray.flatMap { $0 }.flatMap { $0 }
. Mit anderen Worten ist die Abflachung der Abmessungen gleichArray(array.joined())
und die "Abflachung" ohne Entfernung gleicharray.filter{ $0 != nil }.map{ $0! }
.flatMap
ist weiterhin für die in der Frage beschriebene Verwendung geeignet (Reduzieren eines 2D-Arrays auf 1D).compactMap
dient explizit zum Entfernen vonnil
Elementen aus einer Sequenz, wie es eine Variante vonflatMap
einmal getan hat.[[Any]]
,flatMap
wandelt a es einfach in einen Typ von[Any]
([1, 2, 3, 4, [5, 6], 7, 8, 9]) um. Und wenn wir unsflatMap
erneut bewerben würden, würden wir auf ein `Any? Typ, bei dem der Compiler nicht mehr weiß, ob es sich um einen einfachen Wert oder ein Array selbst handelt.In Swift - Standardbibliothek ist es
joined
Funktion für alle Arten implementiert konformSequence
Protokoll (oderflatten
aufSequenceType
vor Swift 3), die umfasstArray
:In bestimmten Fällen
joined()
kann die Verwendung von vorteilhaft sein, da sie eine verzögerte Auflistung anstelle eines neuen Arrays zurückgibt, aber immer in ein Array konvertiert werden kann, wenn sieArray()
wie im obigen Beispiel an den Initialisierer übergeben wird.quelle
FlattenBidirectionalCollection<Array<Array<Int>>>(_base: [[1, 2, 3], [4], [5, 6, 7, 8, 9]]))
. Ihr Punkt ist jedoch gültig, da Sie wie ein flaches Array darauf zugreifen können. Es scheint also, dass dieCustomStringConvertable
Implementierung irreführend ist. Ihr Code-Snippet war und ist jedoch noch nicht getestet.flatten()
wurde umbenannt injoined()
Swift 4.x / 5.x.
Nur um dem Array etwas mehr Komplexität zu verleihen: Wenn es ein Array gibt, das ein Array von Arrays enthält, schlägt dies
flatMap
tatsächlich fehl.Angenommen, das Array ist
Was
flatMap
odercompactMap
kehrt zurück ist:Um dieses Problem zu lösen, können wir unsere einfache for-Schleifenlogik + Rekursion verwenden
Rufen Sie diese Funktion also mit dem angegebenen Array auf
Das Ergebnis ist:
Diese Funktion hilft dabei, jede Art von Array zu reduzieren, wenn man den Fall
Int
hier betrachtetSpielplatzausgabe:
quelle
Swift 4.x.
Diese Verwendung von
flatMap
ist nicht veraltet und es ist dafür gemacht. https://developer.apple.com/documentation/swift/sequence/2905332-flatmapquelle
Bearbeiten: Verwenden Sie
joined()
stattdessen:https://developer.apple.com/documentation/swift/sequence/2431985-joined
Ursprüngliche Antwort:
quelle
Swift 4.2
Ich habe unten eine einfache Array-Erweiterung geschrieben. Sie können ein Array reduzieren, das ein anderes Array oder Element enthält. im Gegensatz zu join () Methode.
Verwendung:
quelle
Eine weitere allgemeinere Implementierung von
reduce
,Dies bewirkt dasselbe, kann jedoch mehr Einblick in das geben, was in dem Geschehen vor sich geht
reduce
.Aus Apples Dokumenten,
Beschreibung
Bringen Sie das Ergebnis der wiederholten Aufruf kombinieren mit einem akkumulierten Wert initialisiert anfänglichen und jedes Element der Sequenz , in der Reihe.
quelle
Use of unresolved identifier 'reduce'
Geänderte Antwort von @ RahmiBozdag: 1. Methoden in öffentlichen Erweiterungen sind öffentlich. 2. Zusätzliche Methode entfernt, da der Startindex immer Null ist. 3. Ich habe keine Möglichkeit gefunden, compactMap für Null und Optionen einzufügen, da in Methode T immer [Beliebig?] Ist. Vorschläge sind willkommen.
quelle
Sie können verschachtelte Arrays mit der folgenden Methode reduzieren:
quelle
Apple Swift Version 5.1.2 (swiftlang-1100.0.278 clang-1100.0.33.9)
Ziel: x86_64-apple-darwin19.2.0
quelle
Swift 5.1
Falls Sie es auch für Wörterbuchwerte möchten:
quelle
flatten()
wurdejoined()
in Swift 3 per SE-0133 umbenannt:https://github.com/apple/swift-evolution/blob/master/proposals/0133-rename-flatten-to-joined.md
quelle
Matrix ist myDTO?
In Swift 5 können Sie this = Array (self.matrix! .Joined ()) verwenden.
quelle
quelle