如何查找列表的模式值?

时间:2014-02-24 20:40:22

标签: scala functional-programming

scala集合中是否有函数可以查找列表中值的最大出现次数

假设我有一个清单

L = List("A","B","B","E","B","E","B","B","C","E","B")

output: "B". 

我可以编写一个模块来计算这个,但我希望应该有一个scala“way”或scala集合函数来实现这一点。谢谢!

3 个答案:

答案 0 :(得分:6)

我不知道现成的方法,但我会这样做:

l.groupBy(i => i).mapValues(_.size).maxBy(_._2)._1

哦,但请注意,这不能处理模式不唯一的情况!

答案 1 :(得分:0)

这为您提供了模式:

import scala.collection.breakOut
import scala.collection.generic.CanBuildFrom
def mode
  [T, CC[X] <: Seq[X]](coll: CC[T])
  (implicit o: T => Ordered[T], cbf: CanBuildFrom[Nothing, T, CC[T]])
  : CC[T] = {
  val grouped = coll.groupBy(x => x).mapValues(_.size).toSeq
  val max = grouped.map(_._2).max
  grouped.filter(_._2 == max).map(_._1)(breakOut)
}

答案 2 :(得分:0)

获取列表(没有RDD)的所有模式:

val grouped = L.groupBy(i => i).map(kv => (kv._1, kv._2.size))
val modeValue = grouped.maxBy(_._2)._2
val modes = grouped.filter(kv => kv._2 == modeValue).map(_._1)