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]