さて、Scala コレクションには groupBy メソッドが用意されていますが、 Seqの場合は次のようになります。
def groupBy[K](f: (A) ⇒ K): immutable.Map[K, Seq[A]]
つまり、リスト内のすべての要素に関数を適用し、結果に基づいてそれらをグループ化します。単語を長さでグループ化するには、関数は文字列を受け取り、その長さを返す必要があります。
//words: Seq[String] = Seq(a, b, c, dd, eee, fff)
val byLength = words.groupBy{(w:String) => w.length}//Map(2 -> Seq(dd),
// 1 -> Seq(a, b, c),
// 3 -> Seq(eee, fff))
または、パラメーターの型宣言を省略して、少し短くすることもできます。コンパイラーはあなたを理解します。
val byLength = words.groupBy(w => w.length)
または、アンダースコアプレースホルダーを使用して無名関数を定義することもできます:
val byLength = words.groupBy(_.length) //same thing
指定した長さの単語を取得できるようになりました。
val singleCharacterWords = byLength(1) //Seq(a, b, c)
または、マップにある程度の長さが含まれているかどうかを確認します
byLength.contains(1) //true
byLength.contains(5) //false
またはすべてのキーを反復処理します。
byLength.foreach{
case (length:Int, wordsGroup:Seq[String]) =>
println(s"Words with length $length : ${wordsGroup.mkString(" ")}")
}
//Words with length 2 : dd
//Words with length 1 : b c
//Words with length 3 : eee fff
そのための地図を参照してください。