哈斯克尔。找到列表中出现频率最高的数字,如果有几个返回它们中的最大值

Yar*_*lav -1 haskell list

给出了一个整数列表。找出其中重复次数最多的数字。如果有多个这样的数字,则返回其中的最大值。

mostFrequent :: [Int] -> Int

--mostFrequent [1,2,2,2,3,3]
--2

--mostFrequent [1,2,2,3,3]
--3
Run Code Online (Sandbox Code Playgroud)

我将这些数字分组为一对列表并排列它们。但是后来我不知道如何比较它们并输出列表中重复次数最多和最大的数字。

mostFrequent :: Ord a => [a] -> [(Int,a)] 
mostFrequent list = map (\l -> (length l, head l)) (group (sort list))
--mostFrequent [1,2,2,3,3]
--[(1,1),(2,2),(2,3)]
Run Code Online (Sandbox Code Playgroud)

帮我解决这个问题。

Ste*_*ans 5

你绝对在正确的轨道上:

  • 对输入进行排序,使相等的元素变得相邻。
  • 将相等的相邻元素分组。
  • 将每个组映射到由组的长度和元素组成的对。

然后:

  • 找到最大值。(这Ord成对实例为您提供字典顺序,这正是您在这里想要的。)
  • 最后,通过投影元素删除最大对(长度)的第一个组件。
import Data.List (group, sort)

mostFrequent :: [Int] -> Int
mostFrequent ns =
  snd (maximum [ (length ks, head ks) | ks <- group (sort ns) ])
Run Code Online (Sandbox Code Playgroud)
> mostFrequent [1,2,2,2,3,3]
2

> mostFrequent [1,2,2,3,3]
3
Run Code Online (Sandbox Code Playgroud)

如果你喜欢无点风格,你当然也可以这样写:

import Control.Arrow ((&&&))
import Data.List (group, sort)

mostFrequent :: [Int] -> Int
mostFrequent = snd . maximum . map (length &&& head) . group . sort
Run Code Online (Sandbox Code Playgroud)