Szybkie sortowanie tablicy rekordów jak i co najlepsze

0

Witam, Czy podpowiecie albo macie gotowe rozwiązania jak posortować taką tablicę?

Type
TCategories = record
    Index: Integer;
    Parent: Integer;
    Name: String;
    FullCategory: String;  //Zawiera polskie znaki
  end;
TArrayCategories = array of TCategories;

var Categories: TArrayCategories; 

Sortowanie Tablicy Categories według Alfabetycznej kolejności zmiennej FullCategory typu string.

1

Użyj listy generycznej – ta powinna mieć metodę Sort, której podaje się funkcję porównującą dwa elementy (u Ciebie rekordy) i zwracającą liczbowy wynik. Jeśli o sortowanie macierzy chodzi, to raczej będziesz musiał sam wszystko napisać.


Niestety nie mam Delphi, więc mogę co najwyżej podać kod napisany w Lazarusie, w trybie zgodności z tym pierwszym. No i nie wiem jak w Delphi, ale Lazarus wymusza zdefiniowanie operatora porównania dla rekordu, więc jego definicja może nie być konieczna.

{$MODE DELPHI}{$LONGSTRINGS ON}{$INLINE ON}{$MODESWITCH ADVANCEDRECORDS}

uses
  Math, FGL;

type
  TCategory = record
  public
    Index: Integer;
    Parent: Integer;
    Name: String;
    FullCategory: String;
  public
    class operator = (const ALeft, ARight: TCategory): Boolean; inline;  // to może nie być konieczne
    class function Compare(const ALeft, ARight: TCategory): Integer; static;
  end;

  class operator TCategory. = (const ALeft, ARight: TCategory): Boolean;
  begin
    Result := (ALeft.Index = ARight.Index) and (ALeft.Parent = ARight.Parent) and
              (ALeft.Name = ARight.Name) and (ALeft.FullCategory = ARight.FullCategory);
  end;

  class function TCategory.Compare(const ALeft, ARight: TCategory): Integer;
  begin
    Result := Math.CompareValue(ALeft.Index, ARight.Index);  // przykładowe porównanie
  end;

var
  Categories: TFPGList<TCategory>;
begin
  Categories := TFPGList<TCategory>.Create();
  try
    Categories.Sort(@TCategory.Compare);  // tu automat sortuje quick sortem
  finally
    Categories.Free();
  end;
end.

To tylko przykład, więc nie traktuj go jako gotowca.

2

od wersji 2009 Delphi ma wbudowane funkcje do sortowania tablic (trzeba dodać do uses System.Generics.Defaults)

TArray.Sort<TCategories>(Categories, TDelegatedComparer<TCategories>.Construct(
  function(const Left, Right: TCategories): Integer
  begin
    Result := TComparer<string>.Default.Compare(Left.FullCategory, Right.FullCategory);
  end));
0

Dziękuję wam bardzo za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1