2016-03-27 17 views
0

私はキャッシュのリストを持っており、それをソートする必要があります。hiddenDate "2007/07/20"(最近は最初)。 hiddenDateパラメータのみを使用して、このリストをOcamlでソートするにはどうすればよいですか?ここでOCamlユーザ定義タイプのソートリスト

type cache = {   
    code: string;  
    name: string;  
    state: string;  
    (...) 
    hiddenDate: string; 
    (...) 
    altitude: int  
} ;; 

val hiddenDateSort: cache list -> cache list 

答えて

2

sort関数のドキュメントです:

val sort : ('a -> 'a -> int) -> 'a list -> 'a list 

は、比較関数に従って 昇順でリストを並べ替えます。比較 関数は、引数が等しい場合は0を返し、最初の方が大きい場合は正の 整数、最初の方が小さい場合は負の整数を返します(詳細はArray.sortを参照)。たとえば、 compareは適切な比較関数です。結果のリストは、昇順にソートされた です。 List.sortは、 (結果リストのサイズに加えて)ヒープスペースと、 の対数スタックスペースで動作することが保証されています。現在の実装では、マージソートを使用します。 これは、一定のヒープ領域と対数スタック領域で実行されます。

したがって、非表示の日付フィールドの比較機能を提供する必要があります。さらに、文字列のように日付を比較するだけでは意味がありません。これにより誤った注文が発生します。最初の近似値は次のようになります。

let date str = Str.(split (regexp "/") str) 
let compare_dates s1 s2 = compare (date s1) (date s2) 
let compare_by_hidden_date c1 c2 = compare_dates c1.hiddenDate c2.hiddenDate 
let sort_by_hidden_date = List.sort compare_by_hidden_date 
+0

日付が固定サイズの最も重要な最初の書式であると仮定すると、文字列を比較すると問題はありません。 – Gilles

+0

@ Gillesはい、これはISOの日付なので、2007-07-20のようなISO形式で書くことをお勧めします –

関連する問題