Comment diviser une liste d'éléments en listes avec au plus N éléments?
ex: Étant donné une liste de 7 éléments, créez des groupes de 4, laissant éventuellement le dernier groupe avec moins d'éléments.
split(List(1,2,3,4,5,6,"seven"),4)
=> List(List(1,2,3,4), List(5,6,"seven"))
Il existe un moyen beaucoup plus simple d'effectuer la tâche en utilisant la méthode de glissement. Cela fonctionne de cette façon:
Disons que vous souhaitez diviser la liste en listes plus petites de taille 3.
te donnera
la source
Ou si vous souhaitez créer le vôtre:
Utilisation:
edit : après avoir examiné cela 2 ans plus tard, je ne recommanderais pas cette implémentation car
size
est O (n), et donc cette méthode est O (n ^ 2), ce qui expliquerait pourquoi la méthode intégrée devient plus rapide pour les grandes listes, comme indiqué dans les commentaires ci-dessous. Vous pouvez mettre en œuvre efficacement comme suit:ou même (légèrement) plus efficacement en utilisant
splitAt
:la source
xs splitAt n
est une alternative à la combinaisonxs take n
etxs drop n
splitAt
au lieu detake
/drop
améliore les performances en moyenne autour de 4%; les deux sont 700-1000% plus rapides que.grouped(n).toList
!grouped-toList
est-ce si lent? Cela ressemble à un bug.grouped
n'existait pas :)), la simplicité est le facteur primordial. Pour la bibliothèque standard, la stabilité et les performances doivent l'emporter sur l'élégance. Mais il y a beaucoup d'exemples à la fois dans Programming in Scala et dans les bibliothèques standard d'appels normaux-récursifs (plutôt que tail-récursifs); c'est une arme standard et importante dans la boîte à outils FP.J'ajoute une version récursive de queue de la méthode de fractionnement car il y avait une discussion de la récursion de queue par rapport à la récursivité. J'ai utilisé l'annotation tailrec pour forcer le compilateur à se plaindre au cas où l'implémentation ne serait pas vraiment recusive. Je crois que la récursivité de la queue se transforme en boucle sous le capot et ne posera donc pas de problèmes, même pour une grande liste, car la pile ne croîtra pas indéfiniment.
la source
Je pense que c'est l'implémentation utilisant splitAt au lieu de take / drop
la source