2014-10-08 5 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"] 
Смежные вопросы