Haskell - 按整数值对带有字符串的列表进行排序的函数

Posted

技术标签:

【中文标题】Haskell - 按整数值对带有字符串的列表进行排序的函数【英文标题】:Haskell - function that sorts list with strings by integer value 【发布时间】:2022-01-18 00:19:27 【问题描述】:

以下是我当前按升序对列表进行排序的代码:

qsort::[Int]->[Int]
qsort[]=[]
qsort(x:xs)
 =qsort[y|y<-xs, y<=x]++[x]++qsort[y|y<-xs,y>x]

我将如何修改/创建一个对列表进行排序的函数,例如:

[("Bob",22),("Peter",38),("Charlie",19)]

通过 int 值

【问题讨论】:

您的代码将变得更加可读,只需在此处和那里添加几个空格! 【参考方案1】:

您可以将项目解包为 2 元组:

qsort::[Int] -> [Int]
qsort [] = []
qsort(x@(_,vx):xs) = qsort [ y | y@(_, vy) <-xs, … ] ++ [x] ++ qsort [ y | y@(_, vy) <- xs, … ]

这里还需要填写部分。 vxx 的值,vy 是元素 y 的值。因此,您需要在vxvy 之间进行比较。

【讨论】:

谢谢.. 只是尝试按照您的代码进行操作,因此 ... 填写的部分将是 vyvx? @John:是的,没错!【参考方案2】:

这是一个可能的策略。首先,定义一个自定义的“小于等于”运算符

lte :: (String, Int) -> (String, Int) -> Bool
lte (str1, int1) (str2, int2) = ...

然后,调整您的qsort 实现,将&lt;= 的每次使用替换为对lte 的调用,并将&gt; 的每次使用替换为对lte 的调用的否定 .

【讨论】:

【参考方案3】:

升序

test = sortBy (compare `on` snd) [("Bob",22),("Peter",38),("Charlie",19)]

降序

test = sortBy (flip compare `on` snd) [("Bob",22),("Peter",38),("Charlie",19)]

交替下降,

import Data.Function (on)
import Data.Ord (Down(Down))

test = sortOn Down [("Bob",22),("Peter",38),("Charlie",19)]

【讨论】:

以上是关于Haskell - 按整数值对带有字符串的列表进行排序的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何按整数值降序对该表进行排序?

Numpy:如何按整数值缩放整数数组?

SQL按整数值的连续范围分组

SQL查询按整数值分组

在编辑器中对枚举项进行排序

Haskell int 列表到字符串