![]() |
Sortiern nach Datum (strings)
Ich habe eine Liste von Daten, die allerdings in Form von Strings gespeichert sind. Die sehen so aus:
Code:
z.B. : 20.02.09 - 05.04.09
Code:
Wie kann ich diese jetzt sortieren? Ich hab es mal mit einem einfachen Bubblesort getestet, aber das schien nicht zu funktionieren.
06.04.09 - 07.06.09
|
AW: Sortiern nach Datum (strings)
Konvertiere die Zeichenfolgen erst in ein Datumsformat und sortiere dann dieses.
|
AW: Sortiern nach Datum (strings)
Zitat:
Der Schlüssel zum Sortieren ist die Vergleichsroutine, mit einem direkten Stringvergleich wirst Du nicht weit kommen, weil der ja alphabetisch und nicht nach Datum sortiert. Aber wenn die Vergleichsfunktion die Daten richtig vergleicht, wird jeder (richtig implementierte) Sortieralgorithmus sortieren. Wenn Du Dir das vorherige Konvertieren in ein Datumsformat sparen willst: function less (a,b: string): boolean; begin less := copy(a,7,2)+copy(a,4,2)+copy(a,1,2) < copy(b,7,2)+copy(b,4,2)+copy(b,1,2) end; Wenn es sich nur um relativ wenige Werte handelt, ist die Ineffizienz, die durch den Zusatzaufwand bei jedem einzelnen Vergleich entsteht, gleichgültig. Die Funktion funktioniert natürlich nur für Daten ab dem Jahr 2000 mit jeweils zweistellig angegebener Jahreszahl, Monatszahl und Tageszahl. |
AW: Sortiern nach Datum (strings)
Moin,
Interessant wäre auch, wie du sortiert hast. Weil BubbleSort sagt ja nur wie man etwas sortiert, aber nicht genau wie man den Code schreibt. Und nach was willst du sortieren? Erstes Datum? Zweites Datum? Differenz? Und dann ist die Vergleichsoperation wichtig. In der Regel (um sowas dynamisch zu gestalten) wird eine Methode genommen die beide Werte bekommt und -1, 0 oder +1 zurückgibt (so ähnlich wie ![]() Ich würde also einfach den Pseudocode aus der Wikipedia nehmen und nach Delphi übersetzen:
Delphi-Quellcode:
Du musst jetzt nur noch die Elemente A[i] und A[i + 1] vertauschen. Ich bin mir nicht sicher ob ein Array als Referenz übergeben wird, also man kein Rückgabewert braucht. Außerdem musst du noch eine Compare-Funktion schreiben (s.o.) die halt einen Wert größer 0 (i.d.R. wird +1 genommen) zurückgibt, wenn das erste Element größer ist als das zweite.
function bubbleSort( A : array of <Datentyp> ) : array of <Datentyp>;
begin n := Length(A); repeat swaped := false; for i := 0 to n - 2 do begin if Compare(A[ i ], A[ i + 1 ]) > 0 then begin // A[i] und A[i + 1] vertauschen swaped := true; end end n := n - 1 until (n < 1) or (not swaped); end; MfG Fabian |
AW: Sortiern nach Datum (strings)
Delphi-Quellcode:
das kanns aber nicht sein. Sollte sein
until (n >= 1) and (swaped);
Delphi-Quellcode:
Und aufpassen, ein dynamisches array beginnt bei Index 0
until (n<1) or not swaped;
|
AW: Sortiern nach Datum (strings)
Ah mist :D In Java gibt es
Code:
und
while() {}
Code:
und beide berechen ab, wenn die Bedingungen nicht zutreffen. Bei Delphi war das ja anders :oops:
do {} while()
Habe den Code mal korrigiert. MfG Fabian PS: Der Off-by-One-Error ist ja beschäment :pale: PPS: Warum ist das jetzt nicht inline.... hmpf |
AW: Sortiern nach Datum (strings)
Noch immer nicht ganz. Es würde zwar so funktionieren, aber mit unnötigen Schleifendurchläufen.
Statt "and" gehört "or" in die Abbruchbedingung, wenn in einem Durchlauf keine Elemente vertauscht werden, ist das feld fertig sortiert. |
AW: Sortiern nach Datum (strings)
Noch besser wäre es m.E. so
1) Am Anfang n nicht auf die Länge des Arrays stellen, sondern auf den höchsten Index. 2) Das Senken von n um 1 nicht am Ende der Repeat-Schleife ausführen, sondern am Anfang. 3) Die For-Schleife von 0 bis n laufen lassen. 4) Beim Until nur swaped abfragen. Die Abfrage, ob n einen bestimmten Grenzwert erreicht hat, ist bei dieser Konstruktion überflüssig.
Delphi-Quellcode:
function bubbleSort( A : array of <Datentyp> ) : array of <Datentyp>;
begin n := High(A); repeat n := n - 1; swaped := false; for i := 0 to n do if Compare(A[ i ], A[ i + 1 ]) > 0 then begin // A[i] und A[i + 1] vertauschen swaped := true; end until not swaped; end; |
AW: Sortiern nach Datum (strings)
Es geht hier ja eigentlich nicht um den besten Sortieralgorithmus (da kann man Mergesort, Quicksort oder Heapsort nehmen), sondern darum, dass er überhaupt erstmal sortiert.
Leider meldet sich der Threadersteller nicht mehr. MfG Fabian |
AW: Sortiern nach Datum (strings)
Danke für die Hilfe.
Ich habe jetzt erst einmal dieser Variante
Delphi-Quellcode:
genutzt. So schnell muss es nicht sein da nur maximal ca. 100 Datensätze sortiert werden müssen.
function less (a,b: string): boolean;
begin less := copy(a,7,2)+copy(a,4,2)+copy(a,1,2) < copy(b,7,2)+copy(b,4,2)+copy(b,1,2) end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz