2016-03-27 11 views
0

Ich habe eine Liste von Cache und ich muss es sortieren nach hiddenDate z. "2007/07/20" (zuletzt zuerst). Wie sortiere ich diese Liste in Ocaml nur mit dem Parameter hiddenDate? HierOCaml Sortierliste von benutzerdefinierten Typen

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

val hiddenDateSort: cache list -> cache list 

Antwort

2

ist die Dokumentation für die sort Funktion:

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

Sortieren einer Liste in teigender Reihenfolge nach einer Vergleichsfunktion. Der Vergleich Funktion muss 0 zurückgeben, wenn seine Argumente als gleich, eine positive ganze Zahl, wenn die erste größer ist, und eine negative ganze Zahl, wenn die erste ist kleiner (siehe Array.Sort für eine vollständige Spezifikation). Zum Beispiel ist vergleichen eine geeignete Vergleichsfunktion. Die resultierende Liste ist sortiert in aufsteigender Reihenfolge. List.sort läuft garantiert in einem konstanten Heap-Space (zusätzlich zur Größe der Ergebnisliste) und logarithmischen Stack-Speicherplatz. Die aktuelle Implementierung verwendet Merge Sort. Er läuft in konstantem Heap-Space und logarithmischem Stack-Space.

Sie müssen also eine Vergleichsfunktion für das Feld für verdeckte Daten bereitstellen. Außerdem können Sie nicht nur Daten wie Strings vergleichen. Dies führt zu Fehlbestellungen. Die erste Näherung wäre die folgende:

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

Vorausgesetzt, dass die Daten in einer festen Größe, am wichtigsten ersten Format sind, ist der Vergleich der Zeichenfolgen in Ordnung. – Gilles

+0

@Gilles ja, und da dies ISO-Datum ist, würde ich vorschlagen, es in einem ISO-Format wie 2007-07-20 zu schreiben –

Verwandte Themen