【问题标题】:Sort a list by number and by name按编号和名称对列表进行排序
【发布时间】:2021-07-06 16:45:45
【问题描述】:

我正在处理一个个人项目,但我在某个点上卡住了。 我有一个列表列表,其中包含 2 个元素,每个元素都是 char 格式。我想按数字对每个列表进行排序,然后如果不同列表中有 2 个相等的数字,则按字母对它们进行排序。

【问题讨论】:

  • 第二项不是数字,它也是一个字符串......所以这意味着"10"小于"2"
  • 您可能想要使用元组列表[(String, Double)] 而不是列表列表,因为后者没有指定内部列表的长度并且不允许两个项目具有不同的类型。

标签: list sorting haskell


【解决方案1】:

列表是Ord 的一个实例,它首先对第一项进行排序,以防第二项出现平局等情况。

我们可以与sortOn :: Ord b => (a -> b) -> [a] -> [a] 合作,根据对这些项目的函数调用结果对元素进行排序。

因此我们可以使用:

import Data.List(sortOn)

sortOn (\(x : y : _) -> (read y :: Double, x)) mylist

对于给定的样本数据,这将产生:

Prelude Data.List> sortOn (\(x : y : _) -> (read y :: Double, x)) mylist
[["Elise","0.9"],["Name","1.2"],["Rex","1.2"],["Diana","2.1"],["Mark","2.1"]]

话虽如此,上面并不是很安全,因为并不是说每个列表至少有两个项目,也不是说第二个项目可以转换为Double

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多