如何找到数组中最常见的元素?

时间:2019-01-24 06:26:27

标签: scala

如何编写一个接受一个整数数组并返回一个整数数组的函数。返回值应包含在输入数组中最常见的整数。

List(5, 4, 3, 2, 4, 5, 1, 6, 1, 2, 5, 4)  => List(5, 4)
List(1, 2, 3, 4, 5, 1, 6, 7)              => List(1)
List(1, 2, 3, 4, 5, 6, 7)                 => List(1, 2, 3, 4, 5, 6, 7)

我已经尝试了以下方法:

def mostFreq(info: List[List[String]]): (String, Int) = 
  info.flatten.groupBy(identity).mapValues(_.size).maxBy(_._2)

但是它不能处理联系。

2 个答案:

答案 0 :(得分:5)

您可以通过groupBy/mapValues/maxBy捕获与所获得的最大频率相似的频率,然后将collect应用于频率图以获得具有最大频率的元素列表,如下所示:

val list = List(5, 4, 3, 2, 4, 5, 1, 6, 1, 2, 5, 4)

val freqMap = list.groupBy(identity).mapValues(_.size)

val maxFreq = freqMap.maxBy(_._2)._2

freqMap.collect{ case (elem, freq) if freq == maxFreq => elem }
// res1: scala.collection.immutable.Iterable[Int] = List(5, 4)

答案 1 :(得分:3)

基于Scala 2.13的{​​{3}}答案的一种替代方法,它使我们能够额外处理空列表:

val list = List(5, 4, 3, 2, 4, 5, 1, 6, 1, 2, 5, 4)
val freqMap = list.groupMapReduce(identity)(_ => 1)(_+_)
// HashMap(5 -> 3, 1 -> 2, 6 -> 1, 2 -> 2, 3 -> 1, 4 -> 3)
val maxFreq = freqMap.maxByOption(_._2).map(_._2)
// Option[Int] = Some(3)
maxFreq.map(max => freqMap.collect { case (x, f) if f == max => x }).getOrElse(Nil)
// List(5, 4)

此:

  • 使用Scala 2.13的新Leo创建频率图:

    • group的项目( MapReduce的组部分)

    • map将每个分组值出现的次数设为1(组 Map Reduce的映射部分)

    • reduce在一组值(_ + _)中的值相加(减少groupMap Reduce 的一部分)。

  • 使用Scala 2.13的新groupMapReduce检索可选的最大频率,以避免空输入列表出现异常。

  • 最后映射可选的最大频率,以便仅收集具有最大频率的项目,否则返回一个空列表。