【问题标题】:Haskell - function that sorts list with strings by integer valueHaskell - 按整数值对带有字符串的列表进行排序的函数
【发布时间】: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 值

【问题讨论】:

  • 您的代码将变得更加可读,只需在此处和那里添加几个空格!

标签: sorting haskell quicksort


【解决方案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)]
    

    【讨论】:

      猜你喜欢
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 2017-09-07
      • 2012-04-03
      • 2017-09-15
      • 2018-08-16
      相关资源
      最近更新 更多