F#中如何对字符串元组构成的列表进行排序
实现方法
核心逻辑分两步处理:
- 逐个调整每个二元组内部的字符串顺序:按忽略大小写的字典序对比两个字符串,把更小的放在元组第一位,更大的放在第二位
- 对调整完内部顺序的元组列表排序:排序时同样用忽略大小写的规则,先对比元组第一位,第一位相等时再对比第二位
直接用F#内置的列表映射和自定义排序函数即可实现,完整代码如下:
let sortPairs (pairs : (string * string) list) = // 忽略大小写的字符串比较函数,返回-1/0/1对应小于/等于/大于 let compareIgnoreCase s1 s2 = System.String.Compare(s1, s2, System.StringComparison.OrdinalIgnoreCase) pairs // 调整每个元组内部的顺序 |> List.map (fun (a, b) -> if compareIgnoreCase a b > 0 then (b, a) else (a, b)) // 按规则对元组列表排序 |> List.sortWith (fun (x1, y1) (x2, y2) -> let firstCompare = compareIgnoreCase x1 x2 if firstCompare <> 0 then firstCompare else compareIgnoreCase y1 y2)
效果验证
对应给出的两个测试用例,运行结果完全符合预期:
// 测试用例1 sortPairs [("Derek", "Christopher")] // 输出:val it : (string * string) list = [("Christopher", "Derek")] // 测试用例2 sortPairs [("Parker", "Derek"); ("dora", "derek")] // 输出:val it : (string * string) list = [("derek", "dora"); ("Derek", "Parker")]
内容的提问来源于stack exchange,提问作者Jeff James
相关产品推荐
相关产品推荐

