按秒元素对列表列表进行排序

时间:2012-01-07 20:13:04

标签: list sorting haskell compare

当我尝试通过第二个元素订购列表列表时遇到了困难,就像这样

list = [[_,B,_,_,_],[_,A,_,_,_],[_,C,_,_,_]]

进入这个:

list = [[_,A,_,_,_],[_,B,_,_,_],[_,C,_,_,_]]

我试过了:

sortBy compare $ [([1,2]!!1),([2,3]!!1)]

但它会过滤秒元素并将其排入[2,3]

2 个答案:

答案 0 :(得分:9)

您尝试做的是按[([1,2]!!1),([2,3]!!1)]对列表[2, 3]进行排序,该列表相当于compare。您希望做的是使用sortBy函数,该函数首先得到第二个元素,然后进行比较:

sortBySecond = sortBy (\ a b -> compare (a !! 1) (b !! 1))

然后获取您拥有的列表并将此功能应用于它:

sortBySecond [[1, 2], [2, 3]]

您可以使用on中的Data.Function

使此功能更整洁
import Data.Function

sortBySecond = sortBy (compare `on` (!! 1))

您还可以使用comparing中的Data.Ord

sortBySecond = sortBy $ comparing (!! 1)

答案 1 :(得分:0)

我提出的另一个想法是使用tail简单地在列表的第二个元素处开始排序。我也试着点免费写它 - 就像我的练习一样。

pfsortBySnd :: (Ord a) => [[a]] -> [[a]]
pfsortBySnd = sortBy second
            where second = comparing tail

sortBySnd :: (Ord a) => [[a]] -> [[a]]
sortBySnd xx = sortBy second xx
             where second x y = compare (tail x) (tail y)