Training for D-Day

ブログの内容は個人の見解であり、所属する企業を代表するものではありません。

【Scala】List(コレクション)をn個ずつの要素に分割する

List(コレクション)をn個ずつの要素に分割したい

ググり方が悪いのかさらっと出てこなかったため自作。
C#だと簡単だった。

qiita.com

例えば、以下の文字列が与えられ、

"あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や - ゆ - よ ら り る れ ろ わ を ん"

コード


5個づつの要素に分割して、以下のようにしたいとします。
(あ い う え お),(か き く け こ),...(わ を ん)


val source = "あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や - ゆ - よ ら り る れ ろ わ を ん" // 
val chunkSize = 5 // ---2

val list = source.split(" ").toList // --- 3
val ret = list.zipWithIndex.groupBy(s => s._2 / chunkSize).flatMap(x => List(x._2)) //  --- 4

ret.foreach(x => println(x)) // --- 5

解説

---2: 分割したい要素の個数
---3: スペース区切りの文字列をリストに変換
---4: zipWithIndexでindex付きでListをchunkSizeでグループ化し、そのままだとmapなので、flatMapでListに変換
---5:出力

出力結果

List((あ,0), (い,1), (う,2), (え,3), (お,4))
List((は,25), (ひ,26), (ふ,27), (へ,28), (ほ,29))
List((か,5), (き,6), (く,7), (け,8), (こ,9))
List((ま,30), (み,31), (む,32), (め,33), (も,34))
List((わ,45), (を,46), (ん,47))
List((さ,10), (し,11), (す,12), (せ,13), (そ,14))
List((や,35), (-,36), (ゆ,37), (-,38), (よ,39))
List((た,15), (ち,16), (つ,17), (て,18), (と,19))
List((ら,40), (り,41), (る,42), (れ,43), (ろ,44))
List((な,20), (に,21), (ぬ,22), (ね,23), (の,24))

並び順がよくわからなくなってしまった。なんでだろう。。