比较 Haskell 中的列表列表

Compare list of lists in Haskell

假设我的列表定义为[[Id, time, priority] , [Id, time, priority], [Id, time, priority] ... ]

在这个例子中,我想根据优先级以递增的方式对我的列表进行排序,如果我有两个相同的优先级,我会根据时间对它们进行排序(时间最长的先到):

来自这个: [["43525", "5", "2"],["25545", "7", "5"],["7455", "3", "4"],["3586", "8", "2"]]

为此: [[3586, 8, 2], [43525, 5, 2], [7455, 3, 4], [25545, 7, 5]]

首先,我使用读取函数和对所有元素的映射将所有字符串转换为 Int :

map (map (read :: String -> Int)) [["43525", "5", "2"],["25545", "7", "5"],["7455", "3", "4"],["3586", "8", "2"]]

您可以定义自定义排序函数并使用 sortBy from Data.List:

import Data.List

toSort = map (map (read :: String -> Int)) [["43525", "5", "2"],["25545", "7", "5"],["7455", "3", "4"],["3586", "8", "2"]]
sortLGT x y = compare (x!!2) (y!!2) -- compare priorities 
    <> compare (y!!1) (x!!1) -- compare time in descending order

sortBy sortLGT toSort

输出:

[[3586,8,2],[43525,5,2],[7455,3,4],[25545,7,5]]

或者按照 @Daniel Wagner 在评论中的建议,使用 sortOn,这应该是更好的选择:

sortOn (\[_id, time, prio] -> (prio, Data.Ord.Down time)) toSort