好吧,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
请参阅地图。