sorting - F# - 如何按降序然后升序对列表进行排序?

标签 sorting f#

我有以下简短的代码,可以简单地计算文本的单词数:

[<EntryPoint>]  
let main argv =   
    let text = File.ReadAllText("gettysburg.txt").ToLower()  
    Regex.Split(text, "\W+")  
    |> Seq.groupBy id  
    |> Seq.map (fun (k, grp) -> (k, grp |> Seq.length))  
    |> Seq.sortByDescending (fun (w, ln) -> (ln, w))  
    |> Seq.iter (fun (k, ln) -> printfn "%s\t%i" k ln)  

sort 函数首先按出现次数排序,然后按字母顺序排序,两者都是降序。我需要按出现次数降序,然后按字母顺序升序。

使用 LINQ 非常容易使用 OrderByDescending 和 ThenBy。我如何在 F# 中获得相同的结果而不重复使用 LINQ?

谢谢你。

最佳答案

您可以改用 sortBy 并将出现次数设为负数:

|> Seq.sortBy (fun (w, ln) -> (-ln, w))

或者,如果您遇到更复杂的情况,您可以使用使用比较器函数的函数 sortWith:
|> Seq.sortWith (fun (w1, ln1) (w2, ln2) -> compare (ln2, w1) (ln1, w2))

实际上,第一个解决方案是针对您的特定情况的捷径,因为您可以将数字设为负数,但是如果您有更多字段,而不是数字,那么通过使用 sortWith 您可以实现与 OrderBy ... ThenBy 在 Linq 中相同的效果, 通过对元组进行排序并在降序时交换元素。

请注意,这两种替代方案都依赖于元组上的 structural comparison

关于sorting - F# - 如何按降序然后升序对列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33993894/

相关文章:

F# 引用 : variable may escape scope

events - 应该如何在 F# 接口(interface)中声明事件?

F#:有效的前缀运算符是什么?

javascript - 如何比排序更快地找到数组的最大子集?

arrays - Pascal 的合并排序示例

.net - F# 中不可变记录类型的复制和更新是共享还是复制内存?

.net - ML.NET:如何解决 "Column with role MatrixColumnIndex should be a known cardinality U4 key, but is instead ' UInt3 2'"

java - 如何比较列表中的两个整数?

sorting - 在 Google 表格中的过滤器 View 中排序时,ArrayFormula 列消失

python - 如何匹配字典中的两个值并合并结果