AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

e-mail adressen ordnen im memo

Ein Thema von biby90 · begonnen am 12. Aug 2011 · letzter Beitrag vom 14. Aug 2011
Antwort Antwort
Seite 5 von 6   « Erste     345 6      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#41

AW: e-mail adressen ordnen im memo

  Alt 13. Aug 2011, 15:13
Was meinst du denn mit "Abhängigkeit"?

<= 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)
$2B or not $2B
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#42

AW: e-mail adressen ordnen im memo

  Alt 13. Aug 2011, 16:19
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).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#43

AW: e-mail adressen ordnen im memo

  Alt 13. Aug 2011, 17:01
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:
x := CompareString(ProviderA, ProviderB);
if x = 0 then
  x := CompareString(MailA, MailB);
(natürlich kann man jetzt noch alles so zusammenrechnen, daß es nur noch <= und > gibt)


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.
$2B or not $2B

Geändert von himitsu (13. Aug 2011 um 17:11 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#44

AW: e-mail adressen ordnen im memo

  Alt 13. Aug 2011, 21:21
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#45

AW: e-mail adressen ordnen im memo

  Alt 13. Aug 2011, 22:10
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#46

AW: e-mail adressen ordnen im memo

  Alt 13. Aug 2011, 22:15
Weil das TStringListSortCompare so nicht hergibt, zumindest nicht in D 2007, oder kann man die überladen? Dann ginge es..
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#47

AW: e-mail adressen ordnen im memo

  Alt 13. Aug 2011, 22:20
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#48

AW: e-mail adressen ordnen im memo

  Alt 13. Aug 2011, 22:35
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..
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#49

AW: e-mail adressen ordnen im memo

  Alt 14. Aug 2011, 07:13
CustomSort kann man eine Sortierfunktion übergeben, jeweils eine Andere, da braucht man keinen weiteren parameter.

Delphi-Quellcode:
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
Bei wem es noch keine anonymen Methoden gibt, der nutzt halt eine "normale" Funktion dafür.

AnsiLowerCase und die If-Vergleiche sind in Delphi-Referenz durchsuchenAnsiCompareText schon eingebaut.
Und nicht über das Ansi wundern ... unter Unicode ist das urplötzlich eine Unicodefunktion, weil irgendwe dachte es wäre cool so.
Oder Delphi-Referenz durchsuchenAnsiComparestr ohne integriertem AnsiLowerCase.
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
$2B or not $2B

Geändert von himitsu (14. Aug 2011 um 07:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#50

AW: e-mail adressen ordnen im memo

  Alt 14. Aug 2011, 10:17
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..
Wenn man sich natürlich entsprechenden Code zusammenbaut, dem man verschiedene Datentypen als Parameter übergibt, dann hat man auch die Fakten, die einem in den Kram passen. Wie ich schon sagte: Memo.Lines und TStringlist sind beide von TStrings abgeleitet, also sollte es letztendlich egal sein, welcher Abkömmling dahintersteckt, sobald man dann TStrings übergibt. Und will man dann den eingebauten Quicksort von TStringlist nutzen, dann weist man innerhalb der Sortier-Routine eben den Parameter einer internen TStringList zu und sortiert diese. Aber ich halte mich jetzt auch aus dem Thema raus, da sich mir der Sinn nicht erschließt. Wenn es Dir Spaß macht, kannst Du ja einen Sortieralgo für die Telefonnummern aller Meiers in Buxtehude unabhängig von der Schreibweise coden, mir ist das Wurscht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


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 06:33 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