Thema: Delphi Natürliche Sortierung

Einzelnen Beitrag anzeigen

xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Natürliche Sortierung

  Alt 19. Jun 2005, 16:10
Hallo,

so, ich hatte etwas Zeit und hab das hier zustande gebracht:

Delphi-Quellcode:
function Compare(List: TStringList; Index1, Index2: Integer): Integer;
var
  Start1, Start2: Integer;
  S1, S2: String;
  N1, N2: Boolean;
  Item1, Item2: String;

  function IsDigit(C: Char): Boolean;
  begin
    Result := (C in ['0'..'9']);
  end;

  function GetNext(S: String; var Start: Integer; var IsNumber: Boolean): String;
  var
    StringLaenge: Integer;
    C, Laenge: Integer;
  begin
    Result := '';
    StringLaenge := Length(S);
    if Start > StringLaenge then
      Exit;

    // Beginnt eine Zahl?
    IsNumber := IsDigit(S[Start]);
    Laenge := 1;

    for C := Start + 1 to StringLaenge do
    begin
      // Weiterhin eine Zahl/ein Wort?
      if IsDigit(S[C]) = IsNumber then
        Inc(Laenge)
      else
        Break;
    end;

    Result := Copy(S, Start, Laenge);
    Inc(Start, Laenge);
  end;

begin
  Result := 0;
  Item1 := List[Index1];
  Item2 := List[Index2];
  // Beide gleich -> Raus hier
  if Item1 = Item2 then
    Exit;

  Start1 := 1;
  Start2 := 1;
  // Alle Teile durchgehen
  repeat
    // Teile holen
    S1 := GetNext(Item1, Start1, N1);
    S2 := GetNext(Item2, Start2, N2);

    // Haben wir zwei Zahlen?
    if N1 and N2 then
    begin // Ja -> Zahlen Vergleichen
     Result := StrToInt(S1) - StrToInt(S2);
    end else
      begin // Nein -> Normaler Stringvergleich
        if List.CaseSensitive then
          Result := AnsiCompareStr(S1, S2)
        else
          Result := AnsiCompareText(S1, S2);
      end;

  until (Result <> 0) or
        (Start1 > Length(Item1)) or
        (Start2 > Length(Item2));
end;
Gruß
xaromz
  Mit Zitat antworten Zitat