比较 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
假设我的列表定义为[[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