如何编写一个接受一个整数数组并返回一个整数数组的函数。返回值应包含在输入数组中最常见的整数。
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)
但是它不能处理联系。
答案 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
检索可选的最大频率,以避免空输入列表出现异常。
最后映射可选的最大频率,以便仅收集具有最大频率的项目,否则返回一个空列表。