AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi StringList: Sortieren nach mehreren Kriterien
Thema durchsuchen
Ansicht
Themen-Optionen

StringList: Sortieren nach mehreren Kriterien

Ein Thema von Aenogym · begonnen am 19. Apr 2006 · letzter Beitrag vom 19. Apr 2006
Antwort Antwort
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#1

StringList: Sortieren nach mehreren Kriterien

  Alt 19. Apr 2006, 11:06
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
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
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: StringList: Sortieren nach mehreren Kriterien

  Alt 19. Apr 2006, 11:14
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!
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: StringList: Sortieren nach mehreren Kriterien

  Alt 19. Apr 2006, 11:25
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
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: StringList: Sortieren nach mehreren Kriterien

  Alt 19. Apr 2006, 11:27
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: StringList: Sortieren nach mehreren Kriterien

  Alt 19. Apr 2006, 12:34
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:13 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 by Thomas Breitkreuz