Objekte nach Datum Sortieren
Ich habe eine Klasse TTerminKalender mit einer ObjectList, die Elemente meiner Klasse TTermin enthält. Nun möchte ich die Objekte in dewr ObjectList nach dem Datem (Eigenschaft von TTermin) sortieren. So geht es, aber geht es besser?
Delphi-Quellcode:
procedure TTerminKalender.Sort;
var i, j: Integer; begin for i := 0 to FTerminListe.Count - 2 do for j := i + 1 to FTerminListe.Count - 1 do if TimeToStr(TTermin(FTerminListe.Items[i]).Time) > TimeToStr(TTermin(FTerminListe.Items[j]).Time) then Tausche(TTermin(FTerminListe.Items[i]), TTermin(FTerminListe.Items[j])); end; procedure TTerminKalender.Tausche(AOne, ATwo: TTermin); var lTemp: TTermin; begin lTemp := TTermin.Create(0, 0,''); try lTemp.Time := AOne.Time; lTemp.Text := AOne.Text; AOne.Time := ATwo.Time; AOne.Text := ATwo.Text; ATwo.Time := lTemp.Time; ATwo.Text := lTemp.Text; finally lTemp.Free; end; end; |
Re: Objekte nach Datum Sortieren
-Statt Bubble-Sort QuickSort verwenden
-Beim Einfügen an richtige Stelle einfügen |
Re: Objekte nach Datum Sortieren
Such dir einen besseren Algorithmus aus.
|
Re: Objekte nach Datum Sortieren
dann eben nicht...
|
Re: Objekte nach Datum Sortieren
Delphi-Quellcode:
Sieht nun so aus. Time ist vom Typ TDateTime. :)
procedure TTerminKalender.Sort;
procedure Swap(AOne, ATwo: TTermin); var lTemp: TTermin; begin lTemp := TTermin.Create(0, 0,''); try lTemp.Time := AOne.Time; lTemp.Text := AOne.Text; AOne.Time := ATwo.Time; AOne.Text := ATwo.Text; ATwo.Time := lTemp.Time; ATwo.Text := lTemp.Text; finally lTemp.Free; end; end; var i, j: Integer; begin for i := 0 to FTerminListe.Count - 1 do for j := 0 to FTerminListe.Count - 2 do if TimeToStr(TTermin(FTerminListe.Items[j]).Time) > TimeToStr(TTermin(FTerminListe.Items[j + 1]).Time) then Swap(TTermin(FTerminListe.Items[j]), TTermin(FTerminListe.Items[j + 1])); end; |
Re: Objekte nach Datum Sortieren
Was soll das mit dem "tauschen" ? Soll die Liste umsortiert werden, oder soll sie nur nach irgendeinem Kriterium sortiert angzeigt/durchlaufen werden ? Kleiner, aber feiner Unterschied ! Desweiteren würde mich mal der genaue Aufruf der Sort-Prozedur im Programm interessieren.
|
Re: Objekte nach Datum Sortieren
Zitat:
Zitat:
Delphi-Quellcode:
myTerminKalender.Sort;
|
Re: Objekte nach Datum Sortieren
Hi,
das wird so nicht funktionieren. 01.03.2008 01.02.2008 01.01.2008 wird zu 01.02.2008 01.03.2008 01.01.2008 das ist IMHO unsortiert ;) Gruß |
Re: Objekte nach Datum Sortieren
Wieso wird eigentlich zum Vergleich in String konvertiert? Man kann TDateTime doch direkt vergleichen.
|
Re: Objekte nach Datum Sortieren
Zitat:
|
Re: Objekte nach Datum Sortieren
Zitat:
|
Re: Objekte nach Datum Sortieren
Zitat:
|
Re: Objekte nach Datum Sortieren
Du musst sogar eine Vergleichsfunktion schreiben und diese der Sort-Methode übergeben.
|
Re: Objekte nach Datum Sortieren
Zitat:
|
Re: Objekte nach Datum Sortieren
Das ist die Klasse, die die ObjectList enthält :zwinker:
|
Re: Objekte nach Datum Sortieren
Bei mir geht das so nicht :
Delphi-Quellcode:
Wer Fragen stellt, der sollte zumindest mal die eigene Syntax überprüfen und die Compilermeldungen nicht ignorieren. Da kann doch fast nur sowas kommen :
DatenObjektListe.Sort;//(@VergleicheWerte);
Zitat:
|
Re: Objekte nach Datum Sortieren
Seine Klasse hat anscheinend eine eigene Sort-Methode implementiert, steht ja im Ausgangspost. Nur wäre es dort sinnvoll, die Sort-Methode der enthaltenen ObjectList aufzurufen, dann sollte es keine Probleme geben und schnell ist das auch noch ;)
|
Re: Objekte nach Datum Sortieren
Zitat:
|
Re: Objekte nach Datum Sortieren
Und das sind auch ganz sicher TDate-Werte?
[edit] Gerade mal mit der D2009-Trial ausprobiert:
Delphi-Quellcode:
Tut genau, wie es soll[/edit]
...
type TMyClass = class private FDatum: TDate; public property Datum: TDate read FDatum write FDatum; end; ... function SortProc(Item1, Item2: Pointer): Integer; begin if TMyClass(Item1).Datum > TMyClass(Item2).Datum then Result := 1 else if TMyClass(Item1).Datum < TMyClass(Item2).Datum then Result := -1 else Result := 0; end; procedure TForm1.FormCreate(Sender: TObject); var dummy: TMyClass; begin FList := TObjectList.Create; dummy := TMyClass.Create; dummy.Datum := StrToDate('01.03.2008'); FList.Add(dummy); dummy := TMyClass.Create; dummy.Datum := StrToDate('01.02.2008'); FList.Add(dummy); dummy := TMyClass.Create; dummy.Datum := StrToDate('01.03.2007'); FList.Add(dummy); dummy := TMyClass.Create; dummy.Datum := StrToDate('01.04.2009'); FList.Add(dummy); dummy := TMyClass.Create; dummy.Datum := StrToDate('01.10.2008'); FList.Add(dummy); FList.Sort(@SortProc); //FList ist vom Typ TObjectList end; |
Re: Objekte nach Datum Sortieren
Bäume und Wald und so. :oops:
Delphi-Quellcode:
Danke für die Gedult und Mühe. :D
procedure TTerminKalender.Sort(AList: TStrings);
function CompareDate(Item1, Item2: Pointer): Integer; var Val1, Val2: TDateTime; begin val1 := TTermin(Item1).FTime; val2 := TTermin(Item2).FTime; Result := DateUtils.CompareDate(Val1, Val2); end; var i, j: Integer; begin for i := 0 to FTerminListe.Count - 2 do for j := i + 1 to FTerminListe.Count - 1 do if CompareDate(TTermin(FTerminListe.Items[i]), TTermin(FTerminListe.Items[j])) = 1 then FTerminListe.Exchange(i, j); end; |
Re: Objekte nach Datum Sortieren
Zitat:
Delphi-Quellcode:
Damit nutzt du nicht den langsamen Bubblesort und deine Exchange Methode kannst du dir auch sparen, da die eh überflüssig ist, denn du musst nicht das Objekt clonen sondern lediglich deren Platz in der ObjektListe vertauschen.
meinKalender.Liste.Sort(@CompareDate);
|
Re: Objekte nach Datum Sortieren
Delphi-Quellcode:
@DeddyH & Jelly: Danke! :mrgreen:
procedure TTerminKalender.Sort(AList: TStrings);
function CompareDate(Item1, Item2: Pointer): Integer; var Val1, Val2: TDateTime; begin val1 := TTermin(Item1).Time; val2 := TTermin(Item2).Time; Result := DateUtils.CompareDate(Val1, Val2); end; begin FTerminListe.Sort(@CompareDate); end; |
Re: Objekte nach Datum Sortieren
Ich dachte, das wäre in meinem Beispiel deutlich geworden :|
|
Re: Objekte nach Datum Sortieren
Genau die Lösung habe ich ja schon ganz am Anfang geschrieben und gezeigt. Schön das du hier nicht jeden ignorierst, so erhälst du ja doch noch irgendwann mal eine brauchbare Lösung...
|
Re: Objekte nach Datum Sortieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz