Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TObjectList Multisort (https://www.delphipraxis.net/209045-tobjectlist-multisort.html)

Codehunter 18. Okt 2021 13:20

TObjectList Multisort
 
Hallo!

Ich habe eine TObjectList und darin Klassen mit z.B. einer "Name" = string und einer "Zeit" = TDateTime Property. Die Einträge sind zunächst wild durcheinander. Ich müsste die Liste nun so sortieren, dass nach "Name" aufsteigend und nach "Zeit" absteigend sortiert wird. Nach der Sortierung sollen alle Einträge mit gleichem Namen untereinander stehen und dabei von Zeile zu Zeile der Zeitwert kleiner werden. Also im Prinzip in Delphi eine Sortierung nachbauen die äquivalent zu dieser SQL-Abfrage sortiert:

SELECT * FROM myTable ORDER BY name ASC, zeit DESC

Grüße
Cody

Klaus01 18. Okt 2021 13:34

AW: TObjectList Multisort
 
.. wenn die Klassen eine einheitlich Basisklasse mit den Properties "Name" und "Zeit" haben
sollte das doch mit der Funktion sort und einer TComparer Funktion gehen:
-> https://docwiki.embarcadero.com/Code...tSort_(Delphi)

Bei Namensgleichheit dann auf die Zeit schauen.

Grüße
Klaus

Stevie 19. Okt 2021 06:39

AW: TObjectList Multisort
 
Delphi-Quellcode:
function CompareItem(Item1, Item2: Pointer): Integer;
begin
  Result := AnsiCompareText(TMyObj(Item1).Name, TMyObj(Item2).Name);
  if Result = 0 then
    Result := CompareDateTime(TMyObj(Item2).Zeit, TMyObj(Item1).Zeit);
end;

...

list.Sort(CompareItem);

Klaus01 19. Okt 2021 06:45

AW: TObjectList Multisort
 
Zitat:

Zitat von Stevie (Beitrag 1496262)
Delphi-Quellcode:
function CompareItem(Item1, Item2: Pointer): Integer;
begin
  Result := AnsiCompareText(TMyObj(Item1).Name, TMyObj(Item2).Name);
  if Result = 0 then
    Result := CompareDateTime(TMyObj(Item2).Zeit, TMyObj(Item1).Zeit);
end;

...

list.Sort(CompareItem);

fehlt da nicht ein "@"
Delphi-Quellcode:
list.Sort(@CompareItem)
oder ist die Hilfe nicht das was sie sein soll?

Stevie 19. Okt 2021 07:20

AW: TObjectList Multisort
 
Kann man weglassen.

Codehunter 19. Okt 2021 11:26

AW: TObjectList Multisort
 
Ich danke euch! Die Lösung ist tatsächlich so einfach. Mich hatte nur die Komplexität der zu sortierenden Liste erschlagen (dreidimensional! Hatte ich nur hier nicht gesagt, weil das vom Problem abgelenkt hätte). Gedanklich habe ich immer versucht, die Liste spaltenweise zu sortieren. Mit eurer Methode muss ich nur die Spaltenwerte nacheinander vergleichen und kann so zeilenweise sortieren, was auch gleich noch viel effizienter ist.

uligerhardt 19. Okt 2021 18:56

AW: TObjectList Multisort
 
Zitat:

Zitat von Stevie (Beitrag 1496264)
Kann man weglassen.

Sollte man weglassen (wo es geht). Verschenkt nur Typsicherheit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 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