Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi StringList: Sortieren nach mehreren Kriterien (https://www.delphipraxis.net/67739-stringlist-sortieren-nach-mehreren-kriterien.html)

Aenogym 19. Apr 2006 10:06


StringList: Sortieren nach mehreren Kriterien
 
hi gemeinschaft,

ich habe folgendes problem: in einer StringList befindet sich der inhalt einer CSV-Datei. etwa so:

Code:
"Niederschlesien","Breslau","Glatz"
"Niederschlesien","Breslau","Neumarkt"
"Niederschlesien","Breslau","Auras"
"Niederschlesien","Breslau","Bernstadt"
"Niederschlesien","Breslau","Breslau"
die einträge der StringList will ich jetzt alphabetisch nach mehreren feldern sortieren. (die CSV-datei stellt eine exportierte datenbank-tabelle dar. bestimmte felder sind die primärschlüssel, nach denen sortiert werden muss).
wenn also die erste und die dritte spalte das kriterium sind, dann muss eben zuerst nach der ersten spalte alphabetisch sortiert werden und danach noch nach der dritten, wobei sich die reihenfolge der werte aus spalte nicht ändern darf.

ich hoffe, ich konnte mein problem einigermaßen verständlich ausdrücken :oops:
nunja, jedenfalls komme ich nicht weiter (CustomSort ist mir schon klar, nur auf die sortier-logik komme ich einfach nicht...)

wäre schön, wenn mir jemand helfen könnte
aenogym

alzaimar 19. Apr 2006 10:14

Re: StringList: Sortieren nach mehreren Kriterien
 
Die Sortierlogik ist doch eigentlich ganz einfach:
Seien W und U die Strings, die Du vergleichen willst.
Seien W1,W2 und W3 die drei Wörter von W, sowie U1, U2 und U3 die drei Wörter von U.

Code:
Wenn W1<U1, dann 'W < U'
sonst wenn W1>U1, dann 'W > U'
sonst wenn W2<U2, dann 'W < U' // W1 = U1, dann 1.Untersortierkriterium
sonst wenn W2>U2, dann 'W > U'
sonst wenn W3<U3, dann 'W < U' // W2 = U2, dann 2.Untersortierkriterium
sonst wenn W3>U3, dann 'W > U'
sonst 'W = U'                 // Jetzt sind W1=U1, W2=U2 und W3=U3, also W=U!

Aenogym 19. Apr 2006 10:25

Re: StringList: Sortieren nach mehreren Kriterien
 
hm stimmt. ich hatte nur angst, dass dadurch schon sortierte zeilen weider durcheinander geraten könnten...

aber danke dir. ich denke, jetzt bekomm ichs hin :)

aeno

alzaimar 19. Apr 2006 10:27

Re: StringList: Sortieren nach mehreren Kriterien
 
Du erstellst eine 'totale Ordnung'. Da wird dann nichts durcheinander gebracht. Überlege mal, wie zwei Strings generell verglichen werden. Nicht Wort für Wort wie bei Dir, sondern Zeichen für Zeichen. Im Grunde genommen genau die gleiche Logik, nur als Schleife verpackt.

marabu 19. Apr 2006 11:34

Re: StringList: Sortieren nach mehreren Kriterien
 
Ich gebe noch etwas ungetesteten Code dazu:

Delphi-Quellcode:
procedure CustomSort(sl: TStringList; sc: TStringListSortCompare; const ida: array of integer);
var
  s1, s2: TStrings;

  function SortCompare(List: TStringList; Index1, Index2: Integer): Integer;
  var
    i: Integer;
  begin
    s1.CommaText := sl[Index1];
    s2.CommaText := sl[Index2];
    for i := Low(ida) to High(ida) do
    begin
      Result := CompareText(s1[ida[i]], s2[ida[i]]);
      if Result <> 0 then Break;
    end;
  end;

begin
  s1 := TStringList.Create;
  s2 := TStringList.Create;
  sl.CustomSort(sc);
  s1.Free;
  s2.Free;
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz