Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Sortierung von Array of Record (https://www.delphipraxis.net/169081-sortierung-von-array-record.html)

knochen 27. Jun 2012 14:51

Sortierung von Array of Record
 
Hallo zusammen,

ich habe einige Arrays vom Typ Record, z.B.

Delphi-Quellcode:
type
  TRecord1 = record
    Datum: String;
    Text1: String;
    Text2: String;
    Text3: String;
  end;

  TRecord1Array = Array of TRecord1;

  TRecord2 = record
    Datum : String;
    Text : String;
    Nummer: Integer;
    Geld : Currency;
  end;

  TRecord2Array = Array of TRecord2;

  TRecord3 = record
    Datum : String;
    Nummer: Integer;
    Text1 : String;
    Text2 : String;
    Text3 : String;
    Text4 : String;
    Text5 : String;
  end;

  TRecord3Array = Array of TRecord3;
Allen Records gemein ist das Datum, und das soll auch mein Sortierkriterium sein.
Gibt es eine Möglichkeit, diese verschiendenen Arrays durch eine einzige Sortierfunktion sortieren zu lassen?

Vielen Dank,
Knochen

jaenicke 27. Jun 2012 14:59

AW: Sortierung von Array of Record
 
Nur mit bösen Hacks, die ich nicht empfehlen würde (z.B. einfach per Pointer zugreifen, da das Feld immer am Anfang steht).

Das Problem sind schlicht die Records. Wenn du stattdessen Klassen nimmst, kannst du das ganze mit Vererbung sehr elegant lösen.

himitsu 27. Jun 2012 15:11

AW: Sortierung von Array of Record
 
Jupp, in neueren Delphis könntest du sehr schön, über die neue erweiterte RTTI, auf die Felder der Records zugreifen.
Geht teilweise auch in der "alten" RTTI, aber eben auch nur mit ein bissl rumgepointere.

Bei Objekten mit zusätzlichen RTTI-Infos, wie z.b. bei TComponent-Nachfahren, kann man auch in älteren Delphis sehr einfach auf Published-Felder der Objekte zugreifen. (das nutzt ja auch schon die VCL, um z.B. Formulare zu laden oder zu speichern)

Oder man geht garnicht erst über die RTTI und nutzt Klassen mit einen gemeinsamen Vorfahren, wie jaenicke schon erwähnte, wo dann das Datum drin steckt.




Pssst, warum ist Datum ein String?
Währe z.B. ein TDateTime nicht einfacher? Vorallem da man dieses sicher vergleichen könnte, ohne auf das Format (wie eventuell das aktuelle Sprachschema) achten und eventuell umwandeln zu müssen.

mkinzler 27. Jun 2012 15:13

AW: Sortierung von Array of Record
 
Fällt aber auch unter "böse" Hacks ...

knochen 27. Jun 2012 15:14

AW: Sortierung von Array of Record
 
OK, bau ich's halt auf Klassen um.
Danke :)

Bummi 27. Jun 2012 15:21

AW: Sortierung von Array of Record
 
Vergiss nicht von einer gemeinsamen Basisklasse mit Datum abzuleiten.

DeddyH 27. Jun 2012 15:34

AW: Sortierung von Array of Record
 
Und wenn das Datum schon ein String sein muss, dann aber am Besten im Format YYYY-MM-DD, sonst wird es schwierig mit dem Sortieren. Noch besser wäre aber, den passenden Datentyp (TDate/TDateTime) zu verwenden.

shmia 27. Jun 2012 15:52

AW: Sortierung von Array of Record
 
Zitat:

Zitat von knochen (Beitrag 1172696)
Gibt es eine Möglichkeit, diese verschiendenen Arrays durch eine einzige Sortierfunktion sortieren zu lassen?

Ja, wenn du für jeden Recordtyp zwei Funktionen bereitstellst.
1.)
Delphi-Quellcode:
function Compare(Index1, Index2: Integer): Integer; // 2 Records vergleichen

2.)
Delphi-Quellcode:
procedure Exchange(Index1, Index2: Integer); // 2 Records vertauschen


In der Code-Library gibt es eine Sortierklasse von mir mit der du nach diesem Prinzip alles sortieren kannst.
Pro Sortieranwendung muss man nur von der Sortierklasse ableiten und die beiden obigen Funktionen implementieren.

knochen 27. Jun 2012 22:56

AW: Sortierung von Array of Record
 
Ja todschick :-D
Bingo, shmia, das wird genommen.

Auch den anderen vielen Dank.

Viele Grüße,
Knochen

himitsu 27. Jun 2012 23:47

AW: Sortierung von Array of Record
 
Zitat:

Zitat von mkinzler (Beitrag 1172703)
Fällt aber auch unter "böse" Hacks ...

Och, die Getter/Setter der neuen RTTI-Klassen empfinde ich da schon als weniger schlimm,
als einfach nur ein paar wilde Casts, hinter denen eventuell noch schnwindlige manuell geschätze Offsetberechnungen stecken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.
Seite 1 von 2  1 2      

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