AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zweidimensionale Objektliste sortieren

Ein Thema von Codehunter · begonnen am 15. Mär 2019 · letzter Beitrag vom 15. Mär 2019
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Zweidimensionale Objektliste sortieren

  Alt 15. Mär 2019, 14:48
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 TSpalte.Sort(const AComparer: IComparer<T>) verwenden sondern muss eine Ebene höher im 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 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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: Zweidimensionale Objektliste sortieren

  Alt 15. Mär 2019, 15:08
"Andere" organisieren die Zellen in Reihen/Zeilen und nicht in Spalten und dann wird es wesentlich einfacher.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
844 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Zweidimensionale Objektliste sortieren

  Alt 15. Mär 2019, 15:35
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 ...
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Zweidimensionale Objektliste sortieren

  Alt 15. Mär 2019, 15:47
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Zweidimensionale Objektliste sortieren

  Alt 15. Mär 2019, 16:38
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:05 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