Ich habe versucht, diese Herausforderung zu lösen: Umkehren eines Arrays von Elementen nach Gruppen mit einer Gruppengröße.
Gegebenes Array : [1, 2, 3, 4, 5, 6]
Gewünschtes Ergebnis (Gruppengröße 3): [4, 5, 6, 1, 2, 3]
Wenn die letzte Gruppe weniger Elemente als die Gruppengröße hat, fügen Sie sie einfach hinzu und beenden Sie sie wie folgt:
Gegebenes Array : [1, 2, 3, 4, 5, 6, 7]
Gewünschtes Ergebnis : [5, 6, 7, 2, 3, 4, 1]
Ich habe es versucht und es funktioniert, aber es sieht irgendwie komisch aus für mich. Kann jemand mir helfen, eine sauberere oder viel intuitivere Lösung zu finden?
%Vor%Sie könnten sagen:
%Vor% Wir verwenden stride(from:through:by:)
, um von array.count
(inklusive) bis 0
(exklusiv) in Schritten von (minus) dem Schritt zu iterieren. Das Swift.
Präfix dient dazu, es von der veralteten Swift 2 stride
-Methode zu unterscheiden (die in Swift 4.1 nicht mehr vorhanden ist) ).
Dann ordnen wir den Index flach auf ein Segment des Eingabearrays an, das bis zu stride
elements lang ist (am Anfang des Arrays wird abgeschnitten, da der untere Index auf 0 begrenzt wird). Und da dies flatMap
ist, werden die resultierenden Slices zu einem einzigen resultierenden Array verkettet.
Sie könnten auch eine vollständig generische Version über Sequence
implementieren, indem Sie zuerst eine Implementierung für BidirectionalCollection
bereitstellen, Indizes rückwärts bewegen und Segmente in ein resultierendes Array einfügen:
und implementieren Sie dann eine Überladung auf Sequence
, die zuerst in ein Array konvertiert und dann auf die obige Implementierung weiterleitet:
Jetzt können Sie es beispielsweise als CountableClosedRange
aufrufen, ohne es zuerst in ein Array konvertieren zu müssen:
Die folgende Lösung basiert auf einer Kombination von stride
+ map
:
Ich denke, Ihre Funktion ist in Ordnung, nicht sicher, was Sie mit seltsamen tbh gemeint haben, kann zu chunk trennen oder jedes Element auf umgekehrte Weise hinzufügen, aber Logik ist sowieso egal, nur müssen die Leistung / Komplexität der einzelnen Möglichkeiten:
%Vor% Die zwei folgenden Swift 4.1-Codefragmente zeigen, wie Sie eine Collection
oder Array
Erweiterungsmethode implementieren, um sie zu chunken, umzukehren und dann in ein neues Array zu reduzieren.
AnyIterator
und Sequence
joined()
Verwendung:
%Vor%%Vor%
%Vor%
stride(from:to:by:)
und Sequence
flatMap(_:)
Verwendung:
%Vor%%Vor%
%Vor%