Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList absteigend sortieren (https://www.delphipraxis.net/170194-tstringlist-absteigend-sortieren.html)

himitsu 4. Sep 2012 23:46

AW: TStringList abwertend sortieren
 
Dieses nennt sich z.B. "Natural Sort" oder Dergleichen.

Es gibt schon irgendwo fertige Funktionen für diesen Vergleich, aber im Prinzip läuft es auf das selbe Grundprinzip hinaus.
Die Strings werden in Buchstaben- und Nummernblöcke aufgeteilt und dann werden von vorne nach hinten die Blöcke "getrennt" verglichen.
Also ein Teil wird verglichen, bei Gleichheit wird der nächste Block verglichen und bei Ungleichheit wird dieses Ergebnis oder das letzte Ergebnis zurückgegeben.

Medium 4. Sep 2012 23:48

AW: TStringList abwertend sortieren
 
Definiere "all zu schwer"

Furtbichler 5. Sep 2012 06:49

AW: TStringList abwertend sortieren
 
Zitat:

Zitat von XxnemesisxX49 (Beitrag 1181593)
Gibt's da auch eine Lösung, die nicht all zu schwer ist? :-D

Ja. Hast Du es schon selbst versucht? Wie würdest Du an die Sache herangehen?

Schau Dir mal die Befehle Delphi-Referenz durchsuchenPos und Delphi-Referenz durchsuchenCopy an.

Bummi 5. Sep 2012 07:09

AW: TStringList abwertend sortieren
 
Je nach Datenherkunft bist Du am schnellsten wenn Du den numerischen Teil mit führenden "0" auf gleiche Längen bringst und dann wieder einen Stringcompare verwendest.

ibp 5. Sep 2012 09:16

AW: TStringList abwertend sortieren
 
ist zwar nicht meine Art trotzdem sticht mir immer wieder das "abwertend" im Titel ins Auge. Könntest du das bitte in "absteigend" ändern?

user0815 5. Sep 2012 10:55

AW: TStringList abwertend sortieren
 
Gibt's da auch eine Lösung, die nicht all zu schwer ist?


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Forms, StdCtrls, Controls;

type
  TZusatzDaten = class(TObject)
   public
     FVorname : string;
     FAlter : Integer;
     constructor Create(Vorname: string; Alter : Integer);
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
    sl : TStringList;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TZusatzDaten.Create(Vorname : string; Alter : Integer);
begin
  Self.FVorname := Vorname;
  Self.FAlter := Alter;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j : Integer;
  Eintrag : TZusatzDaten;
begin
  Memo1.Clear;
  sl := TStringList.Create;

  try
    sl.AddObject('Franzen', TZusatzdaten.Create('Dieter', 36));
    sl.AddObject('Hansen', TZusatzdaten.Create('Hans', 45));
    sl.AddObject('Petersen', TZusatzdaten.Create('Klara', 21));

    // Wert an Position "Hansen" einfügen
    i := sl.IndexOf('Hansen');
    sl.InsertObject(i, 'Paulsen', TZusatzDaten.Create('Paul', 29));

    // Wert ändern
    Eintrag := TZusatzDaten(sl.Objects[0]);
    Eintrag.FVorname := 'Franz';

    // Wert anders ändern
    Eintrag := sl.Objects[3] as TZusatzDaten;
    Eintrag.FVorname := 'Peter';

    for i := 0 to sl.Count -1 do
      Memo1.Lines.Append(sl[i] + ', ' + TZusatzdaten(sl.Objects[i]).FVorname + ' Alter: ' + IntToStr(TZusatzdaten(sl.Objects[i]).FAlter));

    Memo1.Lines.Append('');
    Memo1.Lines.Append('sl Sortieren');
    sl.Sort; // Sortieren

    for i := 0 to sl.Count -1 do
      Memo1.Lines.Append(sl[i] + ', ' + TZusatzdaten(sl.Objects[i]).FVorname + ' Alter: ' + IntToStr(TZusatzdaten(sl.Objects[i]).FAlter));

    sl.Exchange(0,1); // die beiden Werte tauschen

    Memo1.Lines.Append('');
    Memo1.Lines.Append('Tauschen 0 & 1');

    for i := 0 to sl.Count -1 do
      Memo1.Lines.Append(sl[i] + ', ' + TZusatzdaten(sl.Objects[i]).FVorname + ' Alter: ' + IntToStr(TZusatzdaten(sl.Objects[i]).FAlter));

    // Nach Alter sortieren
    for i := sl.Count -1 downto 1 do
     for j := 1 to i do
      if TZusatzdaten(sl.Objects[j-1]).FAlter > TZusatzdaten(sl.Objects[j]).FAlter
       then sl.Exchange(j-1,j);

    Memo1.Lines.Append('');
    Memo1.Lines.Append('Nach Alter sortieren');

    for i := 0 to sl.Count -1 do
      Memo1.Lines.Append(sl[i] + ', ' + TZusatzdaten(sl.Objects[i]).FVorname + ' Alter: ' + IntToStr(TZusatzdaten(sl.Objects[i]).FAlter));

  finally
     for i := 0 to sl.Count -1 do
      if Assigned(sl.Objects[i])
       then sl.Objects[i].Free;

    sl.Free;
  end;
end;

end.

BUG 5. Sep 2012 11:30

AW: TStringList abwertend sortieren
 
Lösungen findest du eventuell auch in dem Thread mit dem lustigen Namen: Intelligentes BubleSort; sortieren wie im Windows Explorer

SirThornberry 5. Sep 2012 12:33

AW: TStringList abwertend sortieren
 
Das einfachste wäre nicht Zahl+Text in der Stringliste zu hinterlegen sondern eine Liste zu nehmen die zum Beispiel Records oder Objekte enthält so das du den Zahlen und Textteil direkt ansprechen kannst und nicht erst jedesmal den String in seine Bestandteile zerlegen.

XxnemesisxX49 5. Sep 2012 14:52

AW: TStringList abwertend sortieren
 
Zitat:

Zitat von Furtbichler (Beitrag 1181616)
Ja. Hast Du es schon selbst versucht? Wie würdest Du an die Sache herangehen?

Schau Dir mal die Befehle Delphi-Referenz durchsuchenPos und Delphi-Referenz durchsuchenCopy an.

Ja, langsam fängt mein Kopf auch schon an zu qualmen. Ich schätze mal, ich muss den String in 2 Teile teilen, die Zahlenteile sortieren und den Textteil dann wieder entsprechend hinzufügen?
Ich hoffe, das war nicht allzu falsch, aber ich arbeite mit Delphi nur einmal pro Woche in der Schule und das auch noch nicht so lange. Vor 2 Monaten wusste ich noch nicht einmal was eine TStringlist ist. Dementsprechend sind halt auch meine Kenntnisse :?

Zitat:

Zitat von ibp (Beitrag 1181631)
ist zwar nicht meine Art trotzdem sticht mir immer wieder das "abwertend" im Titel ins Auge. Könntest du das bitte in "absteigend" ändern?

Wenn du mir sagst, wie ich das mache.

Zitat:

Zitat von SirThornberry (Beitrag 1181659)
Das einfachste wäre nicht Zahl+Text in der Stringliste zu hinterlegen sondern eine Liste zu nehmen die zum Beispiel Records oder Objekte enthält so das du den Zahlen und Textteil direkt ansprechen kannst und nicht erst jedesmal den String in seine Bestandteile zerlegen.

Ich habe aber bisher nur TStringlists gelernt :?

mkinzler 5. Sep 2012 15:03

AW: TStringList abwertend sortieren
 
Zitat:

Zitat von ibp:
ist zwar nicht meine Art trotzdem sticht mir immer wieder das "abwertend" im Titel ins Auge. Könntest du das bitte in "absteigend" ändern?
Wenn du mir sagst, wie ich das mache.
Deinen 1. Beitrag im erweiterten Modus bearbeiten


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:08 Uhr.
Seite 2 von 4     12 34      

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