Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TList.Sort Rückwärts? (https://www.delphipraxis.net/138238-tlist-sort-rueckwaerts.html)

Khabarakh 5. Aug 2009 18:52

Re: TList.Sort Rückwärts?
 
Zitat:

Zitat von xZise
Ich habe mindestens 4 Methoden die ich dann doppelt habe.

Äh, nicht wirklich :gruebel: . Im zweiten Comparer rufst du einfach den ersten mit vertauschten Argumenten auf - immer noch perfekt DRY.

Und wenn dir das immer noch zu viel Syntax-Gewurstel drum herum ist, dann nutze doch die anonymen Methoden von D2009: TList<T> im Zusammenspiel mit TDelegatedComparer<T>.

xZise 5. Aug 2009 19:52

Re: TList.Sort Rückwärts?
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von xZise
Ich habe mindestens 4 Methoden die ich dann doppelt habe.

Äh, nicht wirklich :gruebel: . Im zweiten Comparer rufst du einfach den ersten mit vertauschten Argumenten auf - immer noch perfekt DRY.

Hmmmm also statt
Delphi-Quellcode:
function PublishedCompare(Item1, Item2: Pointer): Integer;
begin
  Result := CompareValue(TVersion(Item1).PublishedTime, TVersion(Item2).PublishedTime);
end;

function PublishedCompareB(Item1, Item2: Pointer): Integer;
begin
  Result := -CompareValue(TVersion(Item1).PublishedTime, TVersion(Item2).PublishedTime);
end;
soll ich
Delphi-Quellcode:
function PublishedCompare(Item1, Item2: Pointer): Integer;
begin
  Result := CompareValue(TVersion(Item1).PublishedTime, TVersion(Item2).PublishedTime);
end;

function PublishedCompareB(Item1, Item2: Pointer): Integer;
begin
  Result := PublishedCompare(Item2, Item1);
end;
aufrufen? Nicht wirklich "weniger"...

Am elegantesten wäre es direkt bei TList:
Delphi-Quellcode:
procedure QuickSort(SortList: PPointerList; L, R, F: Integer;
  SCompare: TListSortCompare);
var
  I, J: Integer;
  P, T: Pointer;
begin
  repeat
    I := L;
    J := R;
    P := SortList^[(L + R) shr 1];
    repeat
      while F*SCompare(SortList^[I], P) < 0 do
        Inc(I);
      while F*SCompare(SortList^[J], P) > 0 do
        Dec(J);
      if I <= J then
      begin
        if I <> J then
        begin
          T := SortList^[I];
          SortList^[I] := SortList^[J];
          SortList^[J] := T;
        end;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSort(SortList, L, J, SCompare);
    L := I;
  until I >= R;
end;

procedure TList.Sort(Compare: TListSortCompare; Backwards : Boolean = False);
var
  F : Integer;
begin
  if Backwards then
    F := -1
  else
    F := 1;
  if (FList <> nil) and (Count > 1) then
    QuickSort(FList, 0, Count - 1, F, Compare);
end;
Zitat:

Zitat von Khabarakh
Und wenn dir das immer noch zu viel Syntax-Gewurstel drum herum ist, dann nutze doch die anonymen Methoden von D2009: TList<T> im Zusammenspiel mit TDelegatedComparer<T>.

1. Wollte ich das auch abwärtskompatibel gestalten :)
2. Gibt es irgendwo ein Tut :P ?

MfG
xZise

Khabarakh 5. Aug 2009 21:22

Re: TList.Sort Rückwärts?
 
Zitat:

Zitat von xZise
Nicht wirklich "weniger"...

Darum ging's auch nicht :P , sondern wie gesagt um DRY. Duplizierte Logik ist schon deshalb schlimm, weil es einfach in fast allen Fällen ohne wirklichen Mehraufwand vermeidbar ist.
Zitat:

Zitat von xZise
2. Gibt es irgendwo ein Tut :P ?

Für Generics oder anonyme Methoden ;) ? Ich kann dir keines selbst empfehlen, aber bei Dr. Bob gibts beides.

xZise 5. Aug 2009 22:10

Re: TList.Sort Rückwärts?
 
Ahcso ich kannte "DRY" bisher noch nicht ;)

MfG
xZise

xZise 14. Aug 2009 13:02

Re: TList.Sort Rückwärts?
 
Moinsen, mir ist gerade eben was aufgefallen bei den Soßen von Classes.pas:
Delphi-Quellcode:
TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
Warum warum warum gibt es das nicht für die TList? Auch erscheint es mir so als wäre TStringList/TStrings fast so wie TList nur mit zusätzlichen Stringoperationen...

MfG
xZise

Reinhard Kern 14. Aug 2009 15:50

Re: TList.Sort Rückwärts?
 
Zitat:

Zitat von xZise
Moinsen, mir ist gerade eben was aufgefallen bei den Soßen von Classes.pas:
Delphi-Quellcode:
TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
Warum warum warum gibt es das nicht für die TList? Auch erscheint es mir so als wäre TStringList/TStrings fast so wie TList nur mit zusätzlichen Stringoperationen...

MfG
xZise

Hallo,

inwiefern würde das dein Problem lösen?

Und wieso leitest du dir nicht einfach eine Klasse TListEx ab und fügst der eine Methode SortReverse hinzu? Ist doch perfectly OO.

Gruss Reinhard

xZise 14. Aug 2009 16:25

Re: TList.Sort Rückwärts?
 
Moin,

es ging mir bei dem letzten Posting nur darum, dass Borland schon mal daran gedacht hat die Liste nach der sortiert wird mit zu übergeben. TList nämlich tut dies nicht. Das hat mich so ein bisschen enttäuscht, da der Code ja nicht von gestern ist. Sondern schon "uralt" und Borland nicht auf die Idee gekommen ist dies zu ändern.

MfG
xZise


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz