![]() |
AW: e-mail adressen ordnen im memo
Was meinst du denn mit "Abhängigkeit"?
Delphi-Quellcode:
ist auch eine Abhängigkeit und wie/was man vergleicht, ist dem Quicksort doch egal?
<=
Im TStringList ist aktuell (seit D2006/2009) ein QuickSort implementiert und diesen kann man sortieren lassen, wie man will (man muß ja nur die Vergleichroutine austauschen) |
AW: e-mail adressen ordnen im memo
Siehe #34, wenn wie dort die Adressen je Provider sortiert werden sollen. Dann hast du einmal < (bzw. >) und einmal =. Da Qicuksort aber immer bei <= tauscht, kann diese unterscheidung nicht getroffen werden (instabiles verfahren).
|
AW: e-mail adressen ordnen im memo
Doch, es ist gegeben.
Beide Teile haen eine Wertigkeit, also erstmal den Provider vergleichen und wenn gleich, dann den Rest vergleichen.
Code:
-1 : <
0 : = +1 : >
Delphi-Quellcode:
if ProviderA < ProviderB then x := -1
else if ProviderA > ProviderB then x := +1 else if PersonA < PersonB then x := -1 else if PersonA > PersonB then x := +1 else x := 0;
Delphi-Quellcode:
(natürlich kann man jetzt noch alles so zusammenrechnen, daß es nur noch <= und > gibt)
x := CompareString(ProviderA, ProviderB);
if x = 0 then x := CompareString(MailA, MailB); Genauso werden die Strings verglichen, also zuerst das erste Zeichen, wenn gleich, dann das nächste Zeichen und so weier. Nun kann man die Zeichen auch in einer anderen Reihenfolge vergleichen, wie z.B. nach dem @ beginnen und am Ende vorne wieder anfangen. :stupid: |
AW: e-mail adressen ordnen im memo
Japp, Funzt, Danke Kumpel, hätte ich nicht gedacht, mich hat das <= *** verunsichert.
Delphi-Quellcode:
type
TQCompare = function (Item1, Item2: string; const SortByProvider: boolean): integer;
Delphi-Quellcode:
function QCompare(Item1, Item2: string; const SortByProvider: boolean): integer;
var Provider1, Provider2, Name1, Name2 : string; begin Item1:= AnsiLowerCase(Trim(Item1)); Item2:= AnsiLowerCase(Trim(Item2)); Result:= 0; if not SortByProvider then begin if Item1 > Item2 then Result:= 1 else if Item1 < Item2 then Result:= -1; end else begin Provider1:= GetDomainPart(Item1); Provider2:= GetDomainPart(Item2); Name1:= GetNamePart(Item1); Name2:= GetNamePart(Item2); if Provider1 > Provider2 then Result:= 1 else if Provider1 < Provider2 then Result:= -1 else if Name1 > Name2 then Result:= 1 else if Name1 < Name2 then Result:= -1; end; end; procedure QuickSort (const Strings: TStrings; L, R: integer; const QCompare: TQCompare; const SortByProvider: boolean); var I, J, K: integer; P: string; begin repeat I:= L; J:= R; K:= (L + R) shr 1; P:= Strings[K]; repeat while QCompare(Strings[I], P, SortByProvider) < 0 do Inc(I); while QCompare(Strings[J], P, SortByProvider) > 0 do Dec(J); if I <= J then // ********************************************************************** begin Strings.Exchange(I, J); Inc(I); Dec(J); end; until I > J; if L < J then QuickSort(Strings, L, J, QCompare, SortByProvider); L:= I; until I >= R; end; procedure TForm1.Button2Click(Sender: TObject); var SL: TStringList; begin SL:= TStringList.Create; SL.Assign(Memo1.Lines); SL.BeginUpDate; QuickSort(SL, 0, SL.Count-1, @QCompare, true); SL.EndUpDate; Memo1.Lines.Assign(SL); SL.Free; end; |
AW: e-mail adressen ordnen im memo
Und schon wieder doppelt gemoppelt. Wieso schreibt man einen Quicksort neu und übergibt dem eine TStringlist, statt einfach deren bereits implementierten zu nutzen? Tut mir leid, das ist mir einfach zu hoch.
|
AW: e-mail adressen ordnen im memo
Weil das TStringListSortCompare so nicht hergibt, zumindest nicht in D 2007, oder kann man die überladen? Dann ginge es..
|
AW: e-mail adressen ordnen im memo
Weiß ich nicht, bin auch zu faul, jetzt noch nachzuschauen. Zur Not leitet man sich eben eine Klasse TEmailList ab, wenn man hochwissenschaftlich EMail-Adressen sortieren möchte, und verpasst der die entsprechenden Properties, die dann bei der Sortierung Berücksichtigung finden.
|
AW: e-mail adressen ordnen im memo
BTW: Gestern hast Du behauptet, ein Memo wäre so schnell wie eine StringList zu sortieren. Stimmt nicht. Heute sagst du, man könne hier eine Methode von StringList verwenden. Stimmt so auch nicht. Soweit die Fakten..
|
AW: e-mail adressen ordnen im memo
CustomSort kann man eine Sortierfunktion übergeben, jeweils eine Andere, da braucht man keinen weiteren parameter.
Delphi-Quellcode:
Bei wem es noch keine anonymen Methoden gibt, der nutzt halt eine "normale" Funktion dafür.
if SortByProvider then
TStringList(nil).CustomSort(function(List: TStringList; Index1, Index2: Integer): Integer begin Result := AnsiCompareText(GetDomainPart(Item1), GetDomainPart(Item2)) if Result = 0 then Result := AnsiCompareText(GetNamePart(Item1), GetNamePart(Item2)); end) else //StringList.CustomSort(function(List: TStringList; Index1, Index2: Integer): Integer // begin // Result := AnsiCompareText(Item1, Item2); // end); StringList.Sort; // hat sich ja nix geändert AnsiLowerCase und die If-Vergleiche sind in ![]() Und nicht über das Ansi wundern ... unter Unicode ist das urplötzlich eine Unicodefunktion, weil irgendwe dachte es wäre cool so. :wall: Oder ![]() und bei falscher Sortierreihenfolge einfach die Parameter tauschen. PS: Sowas wie Folgendes würde ich hiebei nie nutzen, denn ein NOT kann man beim Lesen shcnell mal übersehn und die beiden Then-Else-Zweige kann man ja uch problemlos tauschen.
Delphi-Quellcode:
if not ... then
begin end else |
AW: e-mail adressen ordnen im memo
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 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