Array nach Gruppengröße umkehren

9

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%     
Oxthor 27.12.2017, 08:38
quelle

4 Antworten

1

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:

%Vor%

und implementieren Sie dann eine Überladung auf Sequence , die zuerst in ein Array konvertiert und dann auf die obige Implementierung weiterleitet:

%Vor%

Jetzt können Sie es beispielsweise als CountableClosedRange aufrufen, ohne es zuerst in ein Array konvertieren zu müssen:

%Vor%     
Hamish 27.12.2017, 17:50
quelle
2

Die folgende Lösung basiert auf einer Kombination von stride + map :

%Vor%     
Andrea Mugnaini 27.12.2017 09:22
quelle
1

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%     
Tj3n 27.12.2017 09:18
quelle
0

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.

# 1. Verwenden von AnyIterator und Sequence joined()

%Vor%

Verwendung:

%Vor%

%Vor%

%Vor%

# 2. Verwenden von stride(from:to:by:) und Sequence flatMap(_:)

%Vor%

Verwendung:

%Vor%

%Vor%

%Vor%     
Imanou Petit 30.12.2017 13:37
quelle

Tags und Links