Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Objekte nach Datum Sortieren (https://www.delphipraxis.net/120511-objekte-nach-datum-sortieren.html)

freak4fun 11. Sep 2008 21:42


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;

mkinzler 11. Sep 2008 21:46

Re: Objekte nach Datum Sortieren
 
-Statt Bubble-Sort QuickSort verwenden
-Beim Einfügen an richtige Stelle einfügen

Bernhard Geyer 11. Sep 2008 21:47

Re: Objekte nach Datum Sortieren
 
Such dir einen besseren Algorithmus aus.

omata 11. Sep 2008 22:03

Re: Objekte nach Datum Sortieren
 
dann eben nicht...

freak4fun 11. Sep 2008 22:37

Re: Objekte nach Datum Sortieren
 
Delphi-Quellcode:
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;
Sieht nun so aus. Time ist vom Typ TDateTime. :)

Hansa 12. Sep 2008 02:13

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.

freak4fun 12. Sep 2008 14:27

Re: Objekte nach Datum Sortieren
 
Zitat:

Zitat von Hansa
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 !

Die Liste soll nach dem Datum + Zeit (Time) sortiert werden. Ausgegeben wird sie schrittweise von Anfang bis Ende in einer For-Schleife.
Zitat:

Zitat von Hansa
Desweiteren würde mich mal der genaue Aufruf der Sort-Prozedur im Programm interessieren.

Aufrofüber einen Button mit der Caption "Sortieren". ;)
Delphi-Quellcode:
myTerminKalender.Sort;

angos 12. Sep 2008 14:38

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ß

DeddyH 12. Sep 2008 15:03

Re: Objekte nach Datum Sortieren
 
Wieso wird eigentlich zum Vergleich in String konvertiert? Man kann TDateTime doch direkt vergleichen.

freak4fun 12. Sep 2008 15:29

Re: Objekte nach Datum Sortieren
 
Zitat:

Zitat von DeddyH
Wieso wird eigentlich zum Vergleich in String konvertiert? Man kann TDateTime doch direkt vergleichen.

Das hatte nichts funktioniert. Ich schau da noch mal drüber. :-D

Khabarakh 12. Sep 2008 15:38

Re: Objekte nach Datum Sortieren
 
Zitat:

Zitat von freak4fun
Ich habe eine Klasse TTerminKalender mit einer ObjectList, die Elemente meiner Klasse TTermin enthält.

Mich wundert ein wenig, dass es noch niemand vorgeschlagen hat :gruebel:, sei's drum: Wenn du schon eine TObjectList hast, wie wäre es dann mit TList.Sort (Quicksort)?

freak4fun 12. Sep 2008 15:42

Re: Objekte nach Datum Sortieren
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von freak4fun
Ich habe eine Klasse TTerminKalender mit einer ObjectList, die Elemente meiner Klasse TTermin enthält.

Mich wundert ein wenig, dass es noch niemand vorgeschlagen hat :gruebel:, sei's drum: Wenn du schon eine TObjectList hast, wie wäre es dann mit TList.Sort (Quicksort)?

Kann ich da angeben wonach sortiert wird?

DeddyH 12. Sep 2008 15:44

Re: Objekte nach Datum Sortieren
 
Du musst sogar eine Vergleichsfunktion schreiben und diese der Sort-Methode übergeben.

Hansa 12. Sep 2008 17:18

Re: Objekte nach Datum Sortieren
 
Zitat:

Zitat von freak4fun
Delphi-Quellcode:
myTerminKalender.Sort;

Und was ist myTerminKalender ? Eine TObjectList oder was ???

DeddyH 12. Sep 2008 17:23

Re: Objekte nach Datum Sortieren
 
Das ist die Klasse, die die ObjectList enthält :zwinker:

Hansa 12. Sep 2008 17:23

Re: Objekte nach Datum Sortieren
 
Bei mir geht das so nicht :

Delphi-Quellcode:
DatenObjektListe.Sort;//(@VergleicheWerte);
Wer Fragen stellt, der sollte zumindest mal die eigene Syntax überprüfen und die Compilermeldungen nicht ignorieren. Da kann doch fast nur sowas kommen :
Zitat:

Zitat von D7-Compiler
[Fehler] Ausg.pas(155): Nicht genügend wirkliche Parameter

8)

DeddyH 12. Sep 2008 17:34

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 ;)

freak4fun 14. Sep 2008 14:10

Re: Objekte nach Datum Sortieren
 
Zitat:

Zitat von angos
01.03.2008
01.02.2008
01.01.2008

wird zu

01.02.2008
01.03.2008
01.01.2008

Wie bekomme ich diese Liste als TDateTime sortiert? Mit >, < geht es nicht. :?

DeddyH 14. Sep 2008 14:25

Re: Objekte nach Datum Sortieren
 
Und das sind auch ganz sicher TDate-Werte?

[edit] Gerade mal mit der D2009-Trial ausprobiert:
Delphi-Quellcode:
...

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;
Tut genau, wie es soll[/edit]

freak4fun 14. Sep 2008 15:10

Re: Objekte nach Datum Sortieren
 
Bäume und Wald und so. :oops:
Delphi-Quellcode:
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;
Danke für die Gedult und Mühe. :D

Jelly 14. Sep 2008 16:18

Re: Objekte nach Datum Sortieren
 
Zitat:

Zitat von freak4fun
Delphi-Quellcode:
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;

Genau eine solche Funktion ist es, welche du direkt der TObjekList in der SortMethode als Pointer übergeben kannst...

Delphi-Quellcode:
meinKalender.Liste.Sort(@CompareDate);
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.

freak4fun 14. Sep 2008 16:32

Re: Objekte nach Datum Sortieren
 
Delphi-Quellcode:
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;
@DeddyH & Jelly: Danke! :mrgreen:

DeddyH 14. Sep 2008 16:33

Re: Objekte nach Datum Sortieren
 
Ich dachte, das wäre in meinem Beispiel deutlich geworden :|

omata 14. Sep 2008 19:16

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...

freak4fun 14. Sep 2008 20:00

Re: Objekte nach Datum Sortieren
 
Zitat:

Zitat von omata
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...

Habe ich übersehen! :pale: So wie einiges andere hier. :stupid: Sorry! :oops:


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