通过比较双精度的总和来排序
Sort by comparing the sum of a double
maxSumPair :: [(Int,Int)] -> (Int,Int)
maxSumPair l = head $ sortBy (comparing auxSum) l
auxSum :: (Int,Int) -> Int
auxSum (a,b) = a+b
使用函数 maxSumPair
,我想计算哪个双打的总和最大。
例如,它应该是这样工作的:
> maxSumPairs [(1,10),(6,6),(10,1)]
(6,6)
但是我的函数给出的是 (1,10) 而不是 (6,6)。我的错误是什么?
sortBy
,默认情况下,稳定排序升序。因此,head
将得到最小的一对。相反,您可以将 auxSum
调整为 return 负和值以按降序对实际数据进行排序并获取头部,就像这样
auxSum :: (Int,Int) -> Int
auxSum (a,b) = -(a + b)
> maxSumPair [(1,10),(6,6),(10,1)]
(6,6)
如果你不想改变auxSum
,那么使用last
函数代替head
,像这样
auxSum :: (Int,Int) -> Int
auxSum (a,b) = a + b
maxSumPair :: [(Int,Int)] -> (Int,Int)
maxSumPair l = last $ sortBy (comparing auxSum) l
> maxSumPair [(1,10),(6,6),(10,1)]
(6,6)
注意: 或者,您可以使用 maximumBy
函数,这对于这种情况非常有效(因为 sortBy
会 运行在 O(n * log n) 时间内,但 maximumBy
会在 O(n) 内完成,就像这样
auxSum :: (Int,Int) -> Int
auxSum (a,b) = a + b
> maximumBy (comparing auxSum) [(1,10),(6,6),(10,1)]
(6,6)
补充一下,注意你可以通过翻转比较函数来进行反向排序:
reverseSort xs = sortBy (flip compare) xs
reverseSortBy cmp xs = sortBy (flip cmp) xs
所以你可以这样写:
maxSumPair xs = head $ sortBy (flip $ comparing auxSum) xs
maxSumPair :: [(Int,Int)] -> (Int,Int)
maxSumPair l = head $ sortBy (comparing auxSum) l
auxSum :: (Int,Int) -> Int
auxSum (a,b) = a+b
使用函数 maxSumPair
,我想计算哪个双打的总和最大。
例如,它应该是这样工作的:
> maxSumPairs [(1,10),(6,6),(10,1)]
(6,6)
但是我的函数给出的是 (1,10) 而不是 (6,6)。我的错误是什么?
sortBy
,默认情况下,稳定排序升序。因此,head
将得到最小的一对。相反,您可以将 auxSum
调整为 return 负和值以按降序对实际数据进行排序并获取头部,就像这样
auxSum :: (Int,Int) -> Int
auxSum (a,b) = -(a + b)
> maxSumPair [(1,10),(6,6),(10,1)]
(6,6)
如果你不想改变auxSum
,那么使用last
函数代替head
,像这样
auxSum :: (Int,Int) -> Int
auxSum (a,b) = a + b
maxSumPair :: [(Int,Int)] -> (Int,Int)
maxSumPair l = last $ sortBy (comparing auxSum) l
> maxSumPair [(1,10),(6,6),(10,1)]
(6,6)
注意: 或者,您可以使用 maximumBy
函数,这对于这种情况非常有效(因为 sortBy
会 运行在 O(n * log n) 时间内,但 maximumBy
会在 O(n) 内完成,就像这样
auxSum :: (Int,Int) -> Int
auxSum (a,b) = a + b
> maximumBy (comparing auxSum) [(1,10),(6,6),(10,1)]
(6,6)
补充一下,注意你可以通过翻转比较函数来进行反向排序:
reverseSort xs = sortBy (flip compare) xs
reverseSortBy cmp xs = sortBy (flip cmp) xs
所以你可以这样写:
maxSumPair xs = head $ sortBy (flip $ comparing auxSum) xs