2014-10-08 13 views
8

Ho bisogno di ordinare una lista per ordine di un'altra, ma non so come possa essere fatto.Ordina una lista per ordine di un'altra lista

Per esempio: ho potuto avere una lista a simile a:

[C, B, G, E] 

e un elenco b (che imposta l'ordine) come:

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

(Proprio come esempio, questi aren' i valori effettivi)

Quindi, l'elenco a deve essere ordinato allo stesso modo di Elenco b e quindi essere ordinato in base a :

[A, B, E, G] 

Qualcuno potrebbe darmi una mano su come eseguire questo ordinamento in base all'ordine di un'altra lista?

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

3

Se ho capito, una delle liste indica l'ordine relativo di tutti gli elementi dell'altra lista. Vale a dire:

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

Questo pezzo di codice dovrebbe funzionare:

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

Si potrebbe anche mappare l'ordine di lista e ordinarlo:

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