Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objektliste sortieren (https://www.delphipraxis.net/114033-objektliste-sortieren.html)

Hansa 18. Mai 2008 18:07


Objektliste sortieren
 
Hi,

Kann man TObjectLists nur als string mit CompareText sortieren ? Momentan mache ich das so :

Delphi-Quellcode:
function VergleicheWerte (Item1, Item2: Pointer): Integer;
begin
(*
  Result := CompareText(TDatenObject(Item1).name,
                        TDatenObject(Item2).name);
*)
  Result := CompareText(TDatenObject(Item1).nr,
                        TDatenObject(Item2).nr);
end;
Aufruf so :

Delphi-Quellcode:
RohDaten.Sort(@VergleicheWerte); // Rohdaten = TObjectList
Das auskommentierte geht. Wie soll ich jetzt die nr = integer behandeln ? Die Items haben auch noch real, boolean usw. Felder. Da gehts dann weiter. Muss da immer der Typ umgewandelt werden, oder gibt es Alternativen zu CompareText ? Unschön ist auch noch, dass Delphi Warnungen bringt wegen Pointer und @. Wie kriegt man die weg ?

FAlter 18. Mai 2008 18:10

Re: Objektliste sortieren
 
Hi,

eventuell mit Result := TDatenObject(Item1).nr - TDatenObject(Item2).nr ?

Mfg
FAlter

Sharky 18. Mai 2008 18:11

Re: Objektliste sortieren
 
Hai Hansa,

ein CompareText auf einen Integerwert macht natürlich keinen Sinn. Warum gibst Du nicht einfach das gewünschte Ergebniss der Funktion direkt als Result zurück?

sx2008 18. Mai 2008 18:15

Re: Objektliste sortieren
 
Für jeden Datentyp eine eigene Hilfsfunktion schreiben:
Delphi-Quellcode:
function CompareInt(a,b:Integer):Integer;
begin
  if a > b then Result := 1
  else if a < b then Result := -1
  else Result := 0; // a = b
end;
Aus Optimierungsgründen wird der Fall a=b als letztes abgehandelt, da die Wahrscheinlichkeit
viel geringer als a > b oder a < b ist.

FAlter 18. Mai 2008 18:18

Re: Objektliste sortieren
 
Hi,

Zitat:

Zitat von sx2008
Für jeden Datentyp eine eigene Hilfsfunktion schreiben:
Delphi-Quellcode:
function CompareInt(a,b:Integer):Integer;
begin
  if a > b then Result := 1
  else if a < b then Result := -1
  else Result := 0; // a = b
end;
Aus Optimierungsgründen wird der Fall a=b als letztes abgehandelt, da die Wahrscheinlichkeit
viel geringer als a > b oder a < b ist.

Da es Delphi afaik nur darauf ankommt, ob das Ergebnis <, = oder > 0 ist, wäre es wohl optimierter, b - a zu schreiben - oder gleich oben die Subtraktion anzugeben. Es ist ja nicht nut "zufällig" so, dass es zwar für Strings, aber nicht für Integers fertige Funktionen gibt.

Mfg
FAlter

Hansa 18. Mai 2008 18:20

Re: Objektliste sortieren
 
Hai Hai,

So ungefähr ?

Delphi-Quellcode:
function VergleicheWerte (Item1, Item2: Pointer): boolean;
begin
  Result := TDatenObject(Item1).nr > TDatenObject(Item2).nr;
end;
Das da bringt momentan Zugriffsverletzung. Dem wird das miit @ übergebene boolean nicht schmecken.

himitsu 18. Mai 2008 18:22

Re: Objektliste sortieren
 
seit mindestens D7 Delphi-Referenz durchsuchenCompareValue

Delphi-Quellcode:
uses Math;

function VergleicheWerte(Item1, Item2: Pointer): boolean;
begin
  Result := CompareValue(TDatenObject(Item1).nr, TDatenObject(Item2).nr);
end;

Sharky 18. Mai 2008 18:23

Re: Objektliste sortieren
 
Zitat:

Zitat von Hansa
Hai Hai,

So ungefähr ?....

Hai Hansa,

schaue Dir mal die beiden Beiträge von FAlter an.

sx2008 18. Mai 2008 18:23

Re: Objektliste sortieren
 
Zitat:

Zitat von FAlter
...nur darauf ankommt, ob das Ergebnis <, = oder > 0 ist, wäre es wohl optimierter, b - a zu schreiben - oder gleich oben die Subtraktion anzugeben.

Ja, dem kann ich zustimmen - man müsste nur überlegen, was bei einem Integer-Überlauf so alles passieren kann. Wobei ein Überlauf bei Int32 eher selten vorkommt.

himitsu 18. Mai 2008 18:29

Re: Objektliste sortieren
 
Zitat:

Aus Optimierungsgründen wird der Fall a=b als letztes abgehandelt, da die Wahrscheinlichkeit
viel geringer als a > b oder a < b ist.
dann doch lieber gleich in ASM ... nur einmal vergleichen (CMP) und das Ergebnis mit mit mehreren Jumps (JL JG JE ...) auswerten


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 Uhr.
Seite 1 von 3  1 23      

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