【Scala】List(コレクション)をn個ずつの要素に分割する
List(コレクション)をn個ずつの要素に分割したい
ググり方が悪いのかさらっと出てこなかったため自作。 C#だと簡単だった。
例えば、以下の文字列が与えられ、
"あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や - ゆ - よ ら り る れ ろ わ を ん"
コード
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))
並び順がよくわからなくなってしまった。なんでだろう。。