Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Liste Sortieren nach 2 Parametern (https://www.delphipraxis.net/139290-liste-sortieren-nach-2-parametern.html)

franktron 26. Aug 2009 09:52


Liste Sortieren nach 2 Parametern
 
Ich möchte eine TList Sortieren und zwar habe ich folgende TList

Delphi-Quellcode:
PData = ^TData;
  TData = Record
    X,Y  : Longint;
  End;
und ich will jetzt folgendes Ergebnis haben.

Y X
1 1
1 2
1 3
2 1
2 2
u.s.w

wie kann ich das machen.

mkinzler 26. Aug 2009 10:01

Re: Liste Sortieren nach 2 Parametern
 
Den Vergleichsalgorithmus entsprechend anpassen

franktron 26. Aug 2009 10:04

Re: Liste Sortieren nach 2 Parametern
 
Zitat:

Zitat von mkinzler
Den Vergleichsalgorithmus entsprechend anpassen

Da habe ich ja gerade ein Brett vorm Kopf und mir fällt nicht ein wie :wall:

mkinzler 26. Aug 2009 10:09

Re: Liste Sortieren nach 2 Parametern
 
Der Methode Tlist.Sort() kannst du eine Vergleichsfunktion mitgeben.

fajac 27. Aug 2009 07:04

Re: Liste Sortieren nach 2 Parametern
 
Delphi-Quellcode:
function CompareData (Data1, Data2 : Pointer) : Integer
begin
  if PData(Data1)^.X = PData(Data2)^.X then
    begin
      if PData(Data1)^.Y = PData(Data2)^.Y then
        Result := 0
      else if PData(Data1)^.Y > PData(Data2)^.Y then
        Result := 1
      else
        Result := -1;
    end
  else if PData(Data1)^.X > PData(Data2)^.X then
    Result := 1
  else
    Result := -1;
end;

alzaimar 27. Aug 2009 07:25

Re: Liste Sortieren nach 2 Parametern
 
Oder etwas kompakter:
Delphi-Quellcode:
function CompareData (Data1, Data2 : Pointer) : Integer
begin
  Result := PData(Data1)^.X - PData(Data2)^.X;
  If Result = 0 Then
    Result := PData(Data1)^.Y - PData(Data2)^.Y;
end;

franktron 27. Aug 2009 08:50

Re: Liste Sortieren nach 2 Parametern
 
Danke für die Antworten ich habe das jetzt so gelöst

Delphi-Quellcode:
function CompareNamesY(Item1, Item2: PData): Integer;
begin
  Result:=Round(Item1^.Y+(1/Item1^.X)-Item2^.Y+(1/Item2^.X));
end;

taaktaak 27. Aug 2009 09:55

Re: Liste Sortieren nach 2 Parametern
 
@franktron: ... und das funktioniert? Ich dachte als Funktionsergebnis wird 1, 0 oder -1 erwartet! In deinem Fall könnten bei entsprechenden Y-Werten ja auch andere Ergebnisse zurückgeliefert werden.

Grundsätzlich sollte die "Berliner-Lösung" von alzaimar effizienter sein.

xZise 27. Aug 2009 10:08

Re: Liste Sortieren nach 2 Parametern
 
Nein ;) Es will nur "kleiner 0, 0 oder größer 0":
Delphi-Quellcode:
while SCompare(SortList^[I], P) < 0 do
  Inc(I);
while SCompare(SortList^[J], P) > 0 do
  Dec(J);
Zumindest unter Delphi 2009!

MfG
xZise

gammatester 27. Aug 2009 12:22

Re: Liste Sortieren nach 2 Parametern
 
Zitat:

Zitat von franktron
Danke für die Antworten ich habe das jetzt so gelöst

Delphi-Quellcode:
function CompareNamesY(Item1, Item2: PData): Integer;
begin
  Result:=Round(Item1^.Y+(1/Item1^.X)-Item2^.Y+(1/Item2^.X));
end;

Das kann doch gar nicht funktionieren! Für Item1^.X = 2, Item2^.X = 1, Item1^.Y = 1, Item2^.Y= 4 hat man round(1 + 0.5 - 4 + 1) = round(-1.5) < 0. Das Ergebnis sollte aber doch positiv sein, weil jaItem1^.X > Item2^.X ist. (Oder habe ich was übersehen?)

Gruß Gammatester


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr.
Seite 1 von 2  1 2      

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