Haskell 对数据进行排序。按值映射并获取所有最大值

Haskell 对数据进行排序。按值映射并获取所有最大值,haskell,Haskell,我有数据。地图如下所示: fromList [("eso",1),("mes",1),("ome",2),("som",2)] 我需要从这张地图中获取最大值的键列表: ["ome","som"] 以下是我的解决方案: get_max_from_map m = map fst (filter is_biggest sorted) where sorted = List.sortBy (\(k1, v1) (k2, v2) -> v2 `compare` v1) $ Map.toL

我有数据。地图如下所示:

fromList [("eso",1),("mes",1),("ome",2),("som",2)]
我需要从这张地图中获取最大值的键列表:

["ome","som"]
以下是我的解决方案:

get_max_from_map m = map fst (filter is_biggest sorted)
    where sorted = List.sortBy (\(k1, v1) (k2, v2) -> v2 `compare` v1) $ Map.toList m
          max_v = snd $ head sorted
          is_biggest (key, value) = value == max_v
我将映射转换为列表,对它们进行排序,得到第一个值作为最大值并过滤列表

我只是想知道这个任务是否有更完美的解决方案


谢谢。

您可以使用
Maybe
monad中的
Data.Map
函数来处理此问题

编辑:这是一个使用导入的工作版本

导入控制。镜头
导入数据.Map(Map)
导入符合条件的数据。映射为映射
Eq a=>映射k a->可能[k]
getYourKeys m=do

maxValue您需要执行两项任务-查找最大值、筛选

get_max_from_lst xs = map fst $ filter ((== m) . snd) xs
    where m = maximum $ map snd xs
这是名单

如果我们有地图,那么:

import Data.Map.Lazy as M

get_max_from_map xs = M.keys $ M.filter (== m) xs
    where m = maximum $ M.elems xs

这并不比你原来的帖子简单,但它的优点是,它是一个线性时间,一次通过的解决方案(你的版本是O(n log n),因为它对列表进行排序,到目前为止发布的其他答案是两次通过的解决方案)

getMaxFromMap m=go[]无(Map.toList m)
哪里
go ks[]=ks
去(k,v):休息)=去(k:ks)(只是v)休息
走(只剩下u)(k,v):休息)
|vu=go[k](只是v)休息
|否则=去(k:ks)(只是v)休息

< /代码>如果没有理由进行快速查找,您可能需要考虑使用堆而不是映射。对于堆,最大的元素总是最顶层的元素,因此很容易访问。呃,这实际上是不正确的,只是碰巧适用于您的特定用例<代码>映射。maxView
作用于键,而不是值。我将在一两分钟内解决/删除此问题。(更新:修复)我认为您需要首先将参数转换为列表。
import Data.Map.Lazy as M

get_max_from_map xs = M.keys $ M.filter (== m) xs
    where m = maximum $ M.elems xs
getMaxFromMap m = go [] Nothing (Map.toList m)
  where
    go ks _        []           = ks 
    go ks Nothing  ((k,v):rest) = go (k:ks) (Just v) rest
    go ks (Just u) ((k,v):rest)
        | v < u     = go ks     (Just u) rest
        | v > u     = go [k]    (Just v) rest
        | otherwise = go (k:ks) (Just v) rest