¿Cómo dividir una lista de elementos en listas con como máximo N elementos?
Ej .: Dada una lista con 7 elementos, cree grupos de 4, dejando el último grupo posiblemente con menos elementos.
split(List(1,2,3,4,5,6,"seven"),4)
=> List(List(1,2,3,4), List(5,6,"seven"))
Hay una forma mucho más sencilla de realizar la tarea mediante el método deslizante. Funciona de esta manera:
Supongamos que desea dividir la lista en listas más pequeñas de tamaño 3.
Te regalaré
fuente
O si quieres hacer el tuyo propio:
Utilizar:
editar : al revisar esto 2 años después, no recomendaría esta implementación ya que
size
es O (n), y por lo tanto este método es O (n ^ 2), lo que explicaría por qué el método integrado se vuelve más rápido para listas grandes, como se indica en los comentarios a continuación. Puede implementar de manera eficiente de la siguiente manera:o incluso (un poco) más eficientemente usando
splitAt
:fuente
xs splitAt n
es una alternativa a la combinaciónxs take n
yxs drop n
splitAt
lugar detake
/drop
mejora el rendimiento en promedio alrededor del 4%; ¡Ambos son 700-1000% más rápidos que.grouped(n).toList
!grouped-toList
es tan lento? Eso suena como un error.grouped
no existiera :)), la simplicidad es el factor primordial. Para la biblioteca estándar, la estabilidad y el rendimiento deben triunfar sobre la elegancia. Pero hay muchos ejemplos tanto en Programación en Scala como en las bibliotecas estándar de llamadas recursivas normales (en lugar de recursivas al final); es un arma estándar e importante en la caja de herramientas FP.Estoy agregando una versión recursiva de cola del método de división ya que hubo alguna discusión sobre recursión de cola versus recursión. He usado la anotación tailrec para obligar al compilador a quejarse en caso de que la implementación no sea realmente recusiva. Creo que la recursividad de cola se convierte en un bucle bajo el capó y, por lo tanto, no causará problemas incluso para una lista grande, ya que la pila no crecerá indefinidamente.
fuente
Creo que esta es la implementación que usa splitAt en lugar de take / drop
fuente