Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Deel:
Meldingen
Alles wissen

[Opgelost] Lazarus - QuickSort TStringList naar QuickSort Array of Records

1 Berichten
1 Gebruikers
0 Reactions
2,510 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
Topic starter  

Ik vond de volgende mooie code voor een QuickSort routine voor een TStringList in Lazarus Pascal:

procedure QuickSort(var A: TStringList);
  procedure Sort(L, R: Integer);
  var
    I, J: Integer;
    Y, X:string;
  begin
    I:= L; J:= R; X:= A[(L+R) DIV 2];
    repeat
      while strIcomp(pchar(A),pchar(X))<0 do inc(I);
      while StrIComp(pchar(X),pchar(A[J]))<0 do dec(J);
      if I <= J then
      begin
        Y:= A; A:= A[J]; A[J]:= Y;
        inc(I); dec(J);
      end;
    until I > J;
    if L < J then Sort(L,J);
    if I < R then Sort(I,R);
  end;
begin
  Sort(0,A.Count-1);
end;

Het is bedoelt voor gebruik met een TStringList en wordt als volgt aangeroepen:

QuickSort(MyStringList);

Dat is helaas niet wat ik nodig had - ik wilde namelijk een array of records sorteren.

Hieronder de aangepaste versie voor hets sorteren van mijn array of records:

TSomeLanguage = record
    abbreviation: string;
    name: string;
    englishName: string;
  end;
...
SomeLanguages : array of TSomeLanguage;
...
procedure TNMTVForm.QuickSortLanguages(var A: array of TSomeLanguage);
    procedure Sort(L, R: Integer);
    var
      I, J: Integer;
      Y, X: TTVDBSeries;
    begin
      I:= L; J:= R; X:= A[(L+R) DIV 2];
      repeat
        while strIcomp(pchar(A.englishName),pchar(X.englishName))<0 do inc(I); // <-- adapt to your array
        while StrIComp(pchar(X.englishName),pchar(A[J].englishName))<0 do dec(J); // <-- adapt to your array
        if I <= J then
        begin
          Y:= A; A:= A[J]; A[J]:= Y;
          inc(I); dec(J);
        end;
      until I > J;
      if L < J then Sort(L,J);
      if I < R then Sort(I,R);
    end;
begin
  Sort(0,length(A)-1);
end;
...
QuickSortLanguages(SomeLanguages);
...

Dit sorteert de array "SomeLanguages" op basis van het veld "englishName".
Je ziet ook aangegeven welke 2 regels je moet aanpassen voor jouw eigen array of records.

Hopelijk heeft iemand hier iets aan ... 


   
BeantwoordenCiteren
Deel: