![]() |
Zweidimensionale Objektliste sortieren
Hallo!
Ich habe eine zweidimensionale Objektliste, die (stark vereinfacht) so aussieht:
Delphi-Quellcode:
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
type
TZelle = class(TObject) public ZuSortierendeProperty: string; end; TSpalte = TObjectList<TZelle>; TTabelle = class(TObjectList<TSpalte>) public procedure Sort(const ASpalte: Word); end;
Delphi-Quellcode:
verwenden sondern muss eine Ebene höher im
TSpalte.Sort(const AComparer: IComparer<T>)
Delphi-Quellcode:
ansetzen.
TTabelle
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:
nur in einer Spalte machen, das "Plätze tauschen" aber in allen Spalten gleichzeitig. Oder wie würdet ihr das machen?
TZelle.ZuSortierendeProperty
Viele Grüße Cody |
AW: Zweidimensionale Objektliste sortieren
"Andere" organisieren die Zellen in Reihen/Zeilen und nicht in Spalten und dann wird es wesentlich einfacher.
|
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 ... |
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. |
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 04:35 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