Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 10:19
Ich gehe mal davon aus, dass die Sortierung zur Laufzeit erfolgen soll. Um die Konstantendeklaration zu sortieren, hilft am Ende nur manuelles Verschieben der Zeilen.

Für die Sortierung zur Laufzeit benötigen wir ein dynamisches Array, was am einfachsten generisch als TArray<TCode> deklariert werden kann. In dieses kopieren wir die Werte aus GCodeB und sortieren es dann mit Hilfe der in System.Generics.Default und System.Generics.Collection deklarierten Klassen. Damit die Records auch numerisch sortiert werden, verwenden wir die in System.Sysutils deklarierte string-Helper Funktion Compare mit der Option coDigitAsNumbers .
Delphi-Quellcode:
function GCodeBSorted: TArray<TCode>;
begin
  SetLength(Result, Length(GCodeB));
  for var I := 0 to Length(Result) - 1 do
    Result[I] := GCodeB[Low(GCodeB) + I];
  TArray.Sort<TCode>(Result, TDelegatedComparer<TCode>.Create(
    function(const Left, Right: TCode): Integer
    begin
      Result := string.Compare(Left.Wort, Right.Wort, [coDigitAsNumbers]);
    end));
end;
Dabei ist zu beachten, dass das dynamische Array immer mit dem Index 0 beginnt, während das GCodeB ja als array [1 .. 35] of TCode deklariert ist. Das ist beim Zugriff auf das sortierte Array zu beachten. Hier ein simples Beispiel für den Funktionsaufruf und die Ausgabe des sortierten Arrays:
Delphi-Quellcode:
    var arr := GCodeBSorted;
    for var rec in arr do
      Writeln(rec.Wort, ': ', rec.Bezeichnung);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat