Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Zweidimensionale Objektliste sortieren (https://www.delphipraxis.net/200064-zweidimensionale-objektliste-sortieren.html)

Codehunter 15. Mär 2019 13:48

Zweidimensionale Objektliste sortieren
 
Hallo!

Ich habe eine zweidimensionale Objektliste, die (stark vereinfacht) so aussieht:
Delphi-Quellcode:
type
  TZelle = class(TObject)
  public
    ZuSortierendeProperty: string;
  end;
  TSpalte = TObjectList<TZelle>;
  TTabelle = class(TObjectList<TSpalte>)
  public
    procedure Sort(const ASpalte: Word);
  end;
Nun möchte ich eine Spalte sortieren. Die Spalte soll aber dadurch nicht ihre "zeilenweise Bindung" an die anderen Spalten verlieren. Sonst gibts lustiges Datenchaos. Darum kann ich auch nicht einfach
Delphi-Quellcode:
TSpalte.Sort(const AComparer: IComparer<T>)
verwenden sondern muss eine Ebene höher im
Delphi-Quellcode:
TTabelle
ansetzen.

Nur wie müsste ich die Sache angehen? Meine noch recht vage Idee geht dahin, einen eigenen Quicksort zu implementieren. Dieser würde dann den Vergleich zweier
Delphi-Quellcode:
TZelle.ZuSortierendeProperty
nur in einer Spalte machen, das "Plätze tauschen" aber in allen Spalten gleichzeitig. Oder wie würdet ihr das machen?

Viele Grüße
Cody

Schokohase 15. Mär 2019 14:08

AW: Zweidimensionale Objektliste sortieren
 
"Andere" organisieren die Zellen in Reihen/Zeilen und nicht in Spalten und dann wird es wesentlich einfacher.

Gausi 15. Mär 2019 14:35

AW: Zweidimensionale Objektliste sortieren
 
Wenn die einzelnen Zellen einer Zeile strukturell nicht weiter zu einem Objekt zusammenfassbar sind, dann würde ich auch so eine "simultane Sortiermethode" nehmen, die auf Basis der Vergleiche in einer Spalte auch die Vertauschungen in den anderen Spalten vornimmt.

Eine andere Idee könnte es sein, im Typ TZelle Zeiger auf die linke und rechte Zelle einzufügen. Wenn man dann alle Elemente in der i-ten Zeile von Spalte j haben möchte, muss man dann ausgehend von Tabelle[j][i] diese doppelt verkettete Liste durchgehen, anstatt auf das i-te Element aller Spalten zuzugreifen. Wenn man eine Spalte dann mit dem üblichen Verfahren sortiert, bleibt diese Verkettung ja erhalten. Natürlich muss man dann noch entsprechend Code hinzufügen, wenn man in der Tabelle zwei Spalten vertauscht, um in dieser Richtung zu sortieren - d.h. dann bräuchte man an dieser Stelle eine eigene Sort-Methode ...

stahli 15. Mär 2019 14:47

AW: Zweidimensionale Objektliste sortieren
 
Ich mache es auch wie Schokohase.

Wenn Du weiter bei Spalten bleiben willst, würde ich einen Index aufbauen und den Index sortieren.
Dann kannst Du künftig bei der Ermittlung der Zeilennummer immer über den Index gehen und die Originaltabelle unangetastet lassen oder Du sortierst dann alle Spalten entsprechend der erzeugten Indizes einmal durch und verwirfst die Indizes wieder.

Codehunter 15. Mär 2019 15:38

AW: Zweidimensionale Objektliste sortieren
 
Ich habe jetzt mal einen Prototypen gebaut, der scheint sowohl zu funktionieren als auch noch recht flott zu sein.

Die Struktur spaltenweise statt zeilenweise ist nun mal schon so vorhanden. Stört aber auch nicht weiter. Die Idee mit den verketteten Listen finde ich ausgezeichnet! Da kann man sehr elegante Dinge anstellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 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