Bagaimana cara membagi Daftar elemen menjadi daftar dengan paling banyak N item?
mis .: Diberikan daftar dengan 7 elemen, buat grup yang terdiri dari 4 elemen, biarkan grup terakhir mungkin memiliki lebih sedikit elemen.
split(List(1,2,3,4,5,6,"seven"),4)
=> List(List(1,2,3,4), List(5,6,"seven"))
Ada cara yang jauh lebih mudah untuk melakukan tugas tersebut menggunakan metode geser. Ini bekerja seperti ini:
Katakanlah Anda ingin memecah daftar menjadi daftar ukuran 3 yang lebih kecil.
akan memberimu
sumber
Atau jika Anda ingin membuatnya sendiri:
Menggunakan:
sunting : setelah meninjau ini 2 tahun kemudian, saya tidak akan merekomendasikan implementasi ini karena
size
adalah O (n), dan karenanya metode ini adalah O (n ^ 2), yang akan menjelaskan mengapa metode built-in menjadi lebih cepat untuk daftar besar, seperti yang tercantum dalam komentar di bawah. Anda dapat mengimplementasikan secara efisien sebagai berikut:atau bahkan (sedikit) lebih efisien menggunakan
splitAt
:sumber
xs splitAt n
adalah alternatif untuk kombinasixs take n
danxs drop n
splitAt
bukannyatake
/drop
meningkatkan kinerja rata-rata sekitar 4%; keduanya 700-1000% lebih cepat dari.grouped(n).toList
!grouped-toList
begitu lambat? Kedengarannya seperti bug.grouped
tidak ada :)), kesederhanaan adalah faktor utama. Untuk pustaka standar, stabilitas dan kinerja harus mengalahkan keanggunan. Tapi ada banyak contoh baik dalam Pemrograman di Scala dan pustaka standar panggilan rekursif normal (bukan rekursif ekor); itu adalah senjata standar dan penting dalam kotak peralatan FP.Saya menambahkan versi rekursif ekor dari metode split karena ada beberapa diskusi tentang rekursi ekor versus rekursi. Saya telah menggunakan anotasi tailrec untuk memaksa compiler untuk mengeluh jika implementasinya tidak benar-benar bersifat tail-recusive. Saya yakin rekursi ekor berubah menjadi loop di bawah kap dan dengan demikian tidak akan menimbulkan masalah bahkan untuk daftar besar karena tumpukan tidak akan tumbuh tanpa batas.
sumber
Saya pikir ini adalah implementasi menggunakan splitAt, bukan take / drop
sumber