如何获取列表中的最大值及其对应的索引
解决方案
你当前的写法属于Haskell语法,如果要同时拿到最大值和对应的0基索引,可以按以下方式实现:
- 核心思路:将原列表元素与对应的索引做配对,再按照元素值的大小规则找到最大值对应的配对,拆分出索引和值即可
标准库实现步骤
- 导入需要的工具函数
Data.List模块提供的maximumBy:支持自定义比较逻辑的最大值查找函数Data.Ord模块提供的comparing:快速构造按元组指定字段比较的规则
- 用
zip [0..] 原列表生成(索引, 元素值)格式的配对列表,针对示例列表会生成如下结构:[(0,4.3),(1,0.0),(2,6.2214),(3,9.1),(4,1.023990433763),(5,3.839)]
- 对配对列表按第二项(元素值)执行最大值查找,拆分得到索引和最大值
完整可运行代码如下:
import Data.List (maximumBy) import Data.Ord (comparing) main = do let lst = [4.3,0.0,6.2214,9.1,1.023990433763,3.839] indexedList = zip [0..] lst (maxIndex, maxValue) = maximumBy (comparing snd) indexedList putStrLn $ "最大值:" ++ show maxValue putStrLn $ "对应索引:" ++ show maxIndex
运行输出为:
最大值:9.1 对应索引:3
常见误区:不要直接对
zip [0..] lst的结果使用原生maximum函数。因为Haskell中元组的默认排序规则是先比较第一个元素,会直接取索引最大的配对(即列表最后一个元素),和按值找最大值的需求完全不符。
无额外依赖的手写实现
如果不想导入标准库模块,可以用递归方式手动遍历列表记录最大值和对应索引:
findMaxWithIndex :: Ord a => [a] -> (Int, a) findMaxWithIndex (x:xs) = loop 1 0 x xs where loop _ maxIdx maxVal [] = (maxIdx, maxVal) loop curIdx maxIdx maxVal (next:rest) | next > maxVal = loop (curIdx + 1) curIdx next rest | otherwise = loop (curIdx + 1) maxIdx maxVal rest
调用方式:findMaxWithIndex [4.3,0.0,6.2214,9.1,1.023990433763,3.839],返回结果为(3,9.1),和预期完全一致。
内容的提问来源于stack exchange,提问作者randomdude
相关产品推荐
相关产品推荐

