Como dividir uma lista de elementos em listas com no máximo N itens?
ex: Dada uma lista com 7 elementos, crie grupos de 4, deixando o último grupo possivelmente com menos elementos.
split(List(1,2,3,4,5,6,"seven"),4)
=> List(List(1,2,3,4), List(5,6,"seven"))
Existe uma maneira muito mais fácil de fazer a tarefa usando o método deslizante. Funciona assim:
Digamos que você queira dividir a lista em listas menores de tamanho 3.
Darei à você
fonte
Ou se você quiser fazer o seu próprio:
Usar:
editar : ao revisar isso 2 anos depois, eu não recomendaria esta implementação, pois
size
é O (n) e, portanto, este método é O (n ^ 2), o que explicaria por que o método integrado se torna mais rápido para listas grandes, conforme observado nos comentários abaixo. Você pode implementar de forma eficiente da seguinte maneira:ou mesmo (ligeiramente) mais eficiente usando
splitAt
:fonte
xs splitAt n
é uma alternativa à combinaçãoxs take n
exs drop n
splitAt
invés detake
/drop
melhora o desempenho em média em torno de 4%; ambos são 700-1000% mais rápidos do que.grouped(n).toList
!grouped-toList
é tão lento? Isso parece um bug.grouped
não existisse :)), a simplicidade é o fator predominante. Para a biblioteca padrão, estabilidade e desempenho devem superar a elegância. Mas há muitos exemplos em Programação em Scala e nas bibliotecas padrão de chamadas normal-recursivas (em vez de recursivas de cauda); é uma arma padrão e importante na caixa de ferramentas FP.Estou adicionando uma versão recursiva de cauda do método de divisão, uma vez que houve alguma discussão sobre recursão de cauda versus recursão. Usei a anotação tailrec para forçar o compilador a reclamar no caso de a implementação não ser de fato não-conformista. Acredito que a recursão de cauda se transforme em um loop por baixo do capô e, portanto, não causará problemas mesmo para uma lista grande, pois a pilha não crescerá indefinidamente.
fonte
Acho que esta é a implementação usando splitAt em vez de take / drop
fonte