sorting - 按一个列表的顺序对另一个列表进行排序

标签 sorting haskell

我需要按照另一个列表的顺序对一个列表进行排序,但我不知道如何完成。

例如:我可以有一个类似于以下内容的列表a:

[C, B, G, E]

还有一个列表b(设置顺序):

[A, B, C, D, E, F, G, ...]

(仅作为示例,但这些不是实际值)

然后,列表 a 应该以与列表 b 相同的方式排序,从而排序为:

[B, C, E, G]

如何按照另一个列表的顺序进行排序?

最佳答案

您还可以将顺序映射到列表并对其进行排序:

Prelude> let order = zip ["A", "B", "C", "D", "E", "F", "G"] [0..]

Prelude> let myList = ["C", "B", "G", "E"]

Prelude> import Data.List (sort)

Prelude> map snd . sort . map (\x -> (lookup x order, x)) $ myList

["B","C","E","G"]

因此我们可以将这个函数定义为

sortAlong :: Eq b => [b] -> [b] -> [b]
sortAlong order = map snd . sortBy (comparing fst) . map (\x -> (lookup x z, x))
    where
    z = zip order [0..]

Ord 约束允许通过 Map 更有效地路由,但此版本只需要 Eq:

> sortAlong "ABCDEFG" "CBGE"
"BCEG"

关于sorting - 按一个列表的顺序对另一个列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26260752/

相关文章:

c++ - 用于访问集合的已排序子集的数据结构 C++

java - 如何按值对 Java Map 进行排序,如果值是则按键排序

php - 如何使用 order by 和 order by desc 对 mysql 表中的行进行排序而不会使它变得过于复杂

c - 如何用 C 语言实现这种外部合并排序算法?

Haskell:Control.Category.Monoidal:关联、idl 和 idr 的逆

javascript - 编写一个函数对对象数组进行排序(通过使用另一个对象来指定排序路径和顺序)

haskell - Haskell 是否有 `when` 和 `unless` 的组合?

Haskell 为什么要进行这种类型检查

haskell - 为什么我的 Random 实例行为不正确?

haskell - 为什么 GHC 有时会拒绝偷懒?