由seconds元素排序列表的列表

问题描述 投票:5回答:2

我有一个困难时期,当我试图通过第二元素顺序,列出的名单,像这样

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

这个:

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

我试过了:

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

但它过滤秒元素,并命令进入[2,3]

list sorting haskell compare
2个回答
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]]

您可以通过使用onData.Function使该功能更加整洁:

import Data.Function

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

您也可以从comparing使用Data.Ord

sortBySecond = sortBy $ comparing (!! 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)
© www.soinside.com 2019 - 2024. All rights reserved.