Einzelnen Beitrag anzeigen

Benutzerbild von luwo
luwo

Registriert seit: 8. Jan 2004
Ort: Bamberg
46 Beiträge
 
Delphi XE2 Enterprise
 
#1

"Natürliche" Sortierungen von Strings

  Alt 16. Sep 2004, 15:43
Keine Ahnung, ob dieses Problem nicht schon jemand hier im Forum angesprochen hat,
aber im Netz hab ich einfach keine (brauchbare) Lösung gefunden
und deshalb kurzerhand selbst in die Tasten gegriffen.

Zum Thema Sortierung wurde schon viel geschrieben.
Ich brauchte allerdings keinen superoptimierten Sortierungsalgorithmus,
sondern eher eine einfach Lösung die Strings der "menschlichen Ordnung" nach sortiert.
(ähnlich der natsort()-Funktion von PHP)

Zur Verdeutlichung:

a) normale ASCII-Sortierung:
rfc1.txt
rfc2086.txt
rfc822.txt

b) natürliche/menschliche Sortierung
rfc1.txt
rfc822.txt
rfc2086.txt

Hier ein Link zum Thema.

Der Code ist sicher suboptimal, aber er funzt

Delphi-Quellcode:
function Compare_NaturalSort(List: TStringList; Index1, Index2: Integer): Integer;

  function JustNumbers(instr:string):string ;
  var
    t:integer;
  begin
   for t:=1 to length(instr) do
     if instr[t] in ['0'..'9'] then result:=result+instr[t];
  end;

var
  di1, di2: Integer;
begin
  if not TryStrToInt(JustNumbers(List[Index1]), di1) then
    di1:=0;
  if not TryStrToInt(JustNumbers(List[Index2]), di2) then
    di2:=0;

  if di1<di2 then
    Result:=-1
  else if di1>di2 then
    Result := 1
  else
    Result := 0;
end;

{Anwendungsbeispiel:}

procedure NaturalSort(const Strings2Sort:TStrings) ;
var
  SL:TStringlist;
begin
  SL:=tstringlist.create;

  SL.Assign(Strings2Sort);
  SL.CustomSort(Compare_NaturalSort);
  Strings2Sort.assign(SL);

  SL.free;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  NaturalSort(Listbox1.Items);
end;
shmia hat noch auf etwas hingewiesen:
Zitat:
Deine Compare-Funktion arbeitet IMHO nicht richtig, wenn keine Ziffern enthalten sind.
Man müsste die orginale C-Funktion ( http://sourcefrog.net/projects/natsort/strnatcmp.c ) nach
Delphi übersetzen, dann hat die Sache Hand & Fuss.
Natürlich muss auch der Disclaimer von Martin Pool dazu, sonst wär's ja unfair.
Nachtrag: H4ndy hat die C-Funktion übersetzt und ihr findet diese in diesem Thread weiter unten. MfG, Matze.



[edit=Chakotay1308]Beitrag aufgearbeitet. Mfg, Chakotay1308[/edit]
[edit=Matze]Code aktualisiert. Mfg, Matze[/edit]
[edit=Matze] Mfg, Matze[/edit]
50726F626C656D3F204F53492D53636869636874203821
  Mit Zitat antworten Zitat