5

我想知道是否有一种有效/简单的方法可以通过匹配另一个设置顺序的列表的值来重新排序列表的列表。更具体地说,如果我有以下列表:

[["a", "1", "2"], ["b", "2", "3"]]

我想用以下列表订购它:

["b", "a"]

产生新排序的列表:

[["b", "2", "3"], ["a", "1", "2"]]

有谁知道如何做到这一点?

提前致谢!

最好的问候, Skyfe。

4

1 回答 1

6

基本上,这是通过提供特殊的排序功能来工作的,

import Data.List
import Data.Ord
byLoc :: Eq a => [a] -> -- The list that we're sorting by
                 [a] -> -- First list
                 [a] -> -- Second list
                 Ordering
byLoc ords = comparing (elemIndex . head)

comparing接受一个接收两个列表的函数,并在我们的排序列表中查找每个列表的第一个元素,比较位置。

然后我们只有

sortLoc ords = sortBy (byLoc ords)

我们完成了。不幸的是,这真的很慢。

更快的解决方案是

import Data.Maybe
import Data.List
sortLoc ords xs = mapMaybe lookup ords
  where lookup e = find ((==e) . head) xs

在这里,我们只是在我们的列表中查找适当的元素mapMaybe。如果没有找到元素,那么我们就跳过它。

或者,如果您想使用相同的键支持多个元素

sortLoc ords xs = mapConcat lookup ords
  where lookup e = filter ((==e) . head) xs
于 2013-09-30T01:21:52.947 回答