Wie teile ich eine Liste von Elementen in Listen mit höchstens N Elementen auf?
Beispiel: Erstellen Sie bei einer Liste mit 7 Elementen 4er-Gruppen, wobei die letzte Gruppe möglicherweise weniger Elemente enthält.
split(List(1,2,3,4,5,6,"seven"),4)
=> List(List(1,2,3,4), List(5,6,"seven"))
Es gibt eine viel einfachere Möglichkeit, die Aufgabe mithilfe der Gleitmethode auszuführen. Es funktioniert so:
Nehmen wir an, Sie möchten die Liste in kleinere Listen der Größe 3 aufteilen.
werde dir geben
quelle
Oder wenn Sie Ihre eigenen machen wollen:
Verwenden:
edit : Wenn ich dies 2 Jahre später überprüfe, würde ich diese Implementierung nicht empfehlen, da sie
size
O (n) ist, und daher ist diese Methode O (n ^ 2), was erklären würde, warum die eingebaute Methode für große Listen schneller wird. wie in den Kommentaren unten angegeben. Sie können Folgendes effizient implementieren:oder sogar (etwas) effizienter mit
splitAt
:quelle
xs splitAt n
ist eine Alternative zu der Kombinationxs take n
undxs drop n
splitAt
anstelle vontake
/drop
verbessert wird. beide sind 700-1000% schneller als.grouped(n).toList
!grouped-toList
es so langsam ist? Das klingt nach einem Fehler.grouped
nicht vorhanden :)) ist die Einfachheit der übergeordnete Faktor. Für die Standardbibliothek sollten Stabilität und Leistung die Eleganz übertreffen. Es gibt jedoch viele Beispiele sowohl in der Programmierung in Scala als auch in den Standardbibliotheken für normal rekursive (und nicht für schwanzrekursive) Aufrufe. Es ist eine Standard- und wichtige Waffe in der FP-Toolbox.Ich füge eine rekursive Schwanzversion der Split-Methode hinzu, da einige Diskussionen über Schwanzrekursion und Rekursion geführt wurden. Ich habe die Annotation tailrec verwendet, um den Compiler zu zwingen, sich zu beschweren, falls die Implementierung tatsächlich nicht tail-recusive ist. Ich glaube, die Schwanzrekursion wird zu einer Schleife unter der Haube und verursacht daher auch bei einer großen Liste keine Probleme, da der Stapel nicht unbegrenzt wächst.
quelle
Ich denke, dies ist die Implementierung mit splitAt anstelle von take / drop
quelle