AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Object-Pascal / Delphi-Language Delphi "Natürliche" Sortierungen von Strings
Thema durchsuchen
Ansicht
Themen-Optionen

"Natürliche" Sortierungen von Strings

Ein Thema von luwo · begonnen am 16. Sep 2004 · letzter Beitrag vom 27. Jun 2006
 
Benutzerbild von luwo
luwo

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

"Natürliche" Sortierungen von Strings

  Alt 16. Sep 2004, 14: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
 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz