2014-10-08 3 views
8

하나의 목록을 다른 순서로 정렬해야하지만 어떻게 완료 할 수 있는지 잘 모릅니다.목록을 다른 목록의 순서로 정렬

예를 들어 :

[C, B, G, E] 

그리고 b (순서를 설정하는)과 같은 목록 :

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

(그냥 예로서, 이러한 '때로 믿을 나는 유사한 목록 a을 가질 수 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"] 
관련 문제