2014-10-08 176 views
8

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

例如:我能有类似的列表a

[C, B, G, E] 

和列表b(即设置顺序),如:

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

(正如例如,这些不是活得t的实际值)

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

[A, B, E, G] 

任何人都可以帮助我了解如何按另一个列表的顺序进行排序吗?

任何帮助将不胜感激。

回答

3

如果我明白了,其中一个列表给出了另一个列表中所有元素的相对顺序。即:

> sortWithOrder [5,1,2,3,4] [1,2,3,4,5,5,4,3,2,1] 
[5,5,1,1,2,2,3,3,4,4] 

这段代码应工作:

module SortWithOrder where 

import qualified Data.Map.Strict as M 
import Data.List 
import Data.Ord 

sortWithOrder :: Ord a 
       => [a] -- order list 
       -> [a] -- source list 
       -> [a] 
sortWithOrder order = sortBy (comparing getOrder) 
    where 
     getOrder k = M.findWithDefault (-1) k ordermap 
     ordermap = M.fromList (zip order [0..]) 
3

您也可以在命令映射到列表和排序是:

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"]