我们有对:
(3,10000) (1,2),(2,11) (2,0) (2, 10) (1,1000000)
Run Code Online (Sandbox Code Playgroud)
我们想订购:
(1,2) (1,1000000), (2,0) (2, 10) (2,11) (3,10000)
Run Code Online (Sandbox Code Playgroud)
如何在OCaml中做到这一点?
的List.sort功能,其可以任何排序'a list
,采用类型的一个比较函数'a -> 'a -> int
必须返回一个负数如果第一个参数是严格小于第二个,正面的,如果它是严格更大,和零,如果它们是相等的.
let lexicographic_compare (x,y) (x',y') =
let compare_fst = compare x x' in
if compare_fst <> 0 then compare_fst
else compare y y'
# List.sort lexicographic_compare [ (3,10000); (1,2); (2,11); (2,0); (2, 10); (1,1000000)];;
- : (int * int) list =
[(1, 2); (1, 1000000); (2, 0); (2, 10); (2, 11); (3, 10000)]
Run Code Online (Sandbox Code Playgroud)
(此代码使用内置compare
函数,对整数执行正确的操作.)
请注意,在实践中,该compare
函数已经按字典顺序比较对,因此List.sort compare ...
(不编写任何新代码)似乎可行.虽然它没有指定它如何在对上工作,所以它可能会在将来发生变化,并且依赖于这是糟糕的风格.如果您需要精确的比较顺序,则应编写特定于域的比较.
(当然有些库已经提供了这种lexicographic_compare
逻辑;但关键是要学会如何自己做.)
归档时间: |
|
查看次数: |
776 次 |
最近记录: |