Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi 2 dimensionales Array sortieren die X'te... (https://www.delphipraxis.net/169832-2-dimensionales-array-sortieren-die-xte.html)

Satyr 14. Aug 2012 19:34

2 dimensionales Array sortieren die X'te...
 
Guten Abend,

ich hab nen Knoten im Hirn. Ich will einfach nur ein 2Dimensionales Array nach der 2. Dimension sortieren. Beim Googlen fand ich viel dazu... aber leider nichts was ich verstehe. Das meiste war entweder für Strings gedacht oder sah mir zu aufwändig aus, für die kleine Sache.
Mein Array ist dynamisch und recht einfach:

Delphi-Quellcode:
meinArray : Array of Array of Integer;
es werden 2 Felder benutzt und mit Zahlen gefüllt:

Delphi-Quellcode:
meinArray[z][1] := StrToInt(beispielzahl1);
meinArray[z][2] := StrToInt(beispielzahl2);
Klappt bis hierhin wie es soll. Array wird gefüllt, kann ausgelesen werden... aber wie ich es nach dem zweiten Feld sortiere verstehe ich nicht.

Mit BubbleSort soll das einfach sein, las ich. Aber ich weiß nicht wie ich das auf meinen Fall anwende...

Gruß,
Andreas

sx2008 14. Aug 2012 19:49

AW: 2 dimensionales Array sortieren die X'te...
 
Sortieren benötigt immer 2 Grundoperationen: Vergleichen (Compare) und Vertauschen (Swap)
Versuche 2 Funktionen zu schreiben:
Delphi-Quellcode:
function CompareMyArray(a,b:integer):integer;
const
  VERGLEICHINDEX = 0;
begin
  if meinArray[VERGLEICHINDEX][a] > meinArray[VERGLEICHINDEX][b] then
    result := 1
  else if meinArray[VERGLEICHINDEX][a] > meinArray[VERGLEICHINDEX][b] then
    result := -1
  else
    result := 0;
   // Hinweis: mit Sign() geht es einfacher und eleganter
end;

procedure SwapMyArray(a,b:integer);
var i : integer;
begin
  for i := 0 to obergrenze do
    SwapInteger(meinArray[i][a], meinArray[i][b]);
end;
Damit kannst du nun beliebige Sortierverfahren ansetzen, die CompareXXXX() oder SwapXXXX() benützen.

Satyr 14. Aug 2012 19:56

AW: 2 dimensionales Array sortieren die X'te...
 
Danke, das hilft schonmal die Logik ein wenig besser zu verstehen.
Allerdings hab ich das Array nicht global definiert. Es ist nur in einer kleiner Funktion existent, weil es nichts großes macht.
Kann ich das Array irgendwie an die beiden Funktionen übergeben?

sx2008 14. Aug 2012 20:03

AW: 2 dimensionales Array sortieren die X'te...
 
Wenn du dem Array ein Typ gibst kannst du es auch durchreichen:
Delphi-Quellcode:
Type
 Tmein2DArray = Array of Array of Integer;

// und später
meinArray : Tmein2DArray;

function CompareMyArray(X:Tmein2DArray;a,b:integer):integer;
const
  VERGLEICHINDEX = 0;
begin
  if X[VERGLEICHINDEX][a] > X[VERGLEICHINDEX][b] then
    result := 1
  else if X[VERGLEICHINDEX][a] > X[VERGLEICHINDEX][b] then
    result := -1
  else
    result := 0;
   // Hinweis: mit Sign() geht es einfacher und eleganter
end;
Noch besser wäre es, wenn du das Array sammt Compare-, Swap- und Sortierfunktion in einer Klasse verpacken würdest.

Satyr 14. Aug 2012 20:07

AW: 2 dimensionales Array sortieren die X'te...
 
Man, das klingt irgendwie aufwändiger als ich es von PHP kenne *g*.
Danke Dir, ich werde morgen weiter versuchen das hinzubekommen. Ich hätte nicht gedacht das es so ein Aufwand ist "mal eben" ein Array zu sortieren.

Aphton 14. Aug 2012 21:11

AW: 2 dimensionales Array sortieren die X'te...
 
sx, das geht aber so einfacher:

Delphi-Quellcode:
type
  TIntArray = Array of Integer;
  TInt2DArray = Array of TIntArray;

var
  meinArray : TInt2DArray;

  i := <irgendEinIndex>;
  IrgendEineSortFunktionDieEinIntArrayAnnimmt(meinArray[i]);
Zitat:

Danke Dir, ich werde morgen weiter versuchen das hinzubekommen. Ich hätte nicht gedacht das es so ein Aufwand ist "mal eben" ein Array zu sortieren.
es ist eig. gar kein Aufwand..

Medium 15. Aug 2012 08:27

AW: 2 dimensionales Array sortieren die X'te...
 
Und streng genommen sind Arrays auch schon hart an ihrer Sinnhaftigkeitsgrenze wenn sortiert werden soll ;)
Da würde sich eher eine Liste anbieten, und statt der 2 Dimensionen ein Klässlein mit diesen als Feldern, so dass man mit einer schlanken Compare-Funktion schon in einer Hand voll Zeilen mehr am Ziel wäre. Zumal man den Sortieralgo nicht noch selber machen muss.

Satyr 15. Aug 2012 11:54

AW: 2 dimensionales Array sortieren die X'te...
 
Zitat:

Zitat von Medium (Beitrag 1178324)
Und streng genommen sind Arrays auch schon hart an ihrer Sinnhaftigkeitsgrenze wenn sortiert werden soll ;)
Da würde sich eher eine Liste anbieten, und statt der 2 Dimensionen ein Klässlein mit diesen als Feldern, so dass man mit einer schlanken Compare-Funktion schon in einer Hand voll Zeilen mehr am Ziel wäre. Zumal man den Sortieralgo nicht noch selber machen muss.

Das hab ich so in der Art auch gemerkt. Ich versuche grad was eigentlich "schmutziges"...
Meine Daten einfach in eine ListBox oder StringGrid packen und dort sortieren lasse. Das ganze nicht visible. Ist keine elegante Lösung, fühlt sich aber einfacher an *g*.

himitsu 15. Aug 2012 12:05

AW: 2 dimensionales Array sortieren die X'te...
 
unsichtbare ListBox = TStringList :roll:

Satyr 15. Aug 2012 12:14

AW: 2 dimensionales Array sortieren die X'te...
 
Zitat:

Zitat von himitsu (Beitrag 1178357)
unsichtbare ListBox = TStringList :roll:

Mit exakt den gleichen Funktionen und mehreren Colums ?

Wofür gibts dann überhaupt Arrays?

himitsu 15. Aug 2012 12:15

AW: 2 dimensionales Array sortieren die X'te...
 
Hatte eine ListBox nicht nur eine Spalte und die ListView mehrere?
Aber bei einer Spalte und zusammen mit dem Data-Property (aka Objects der TStringList) kommt man auch auf mehrere Daten pro Zeile.

Satyr 15. Aug 2012 12:19

AW: 2 dimensionales Array sortieren die X'te...
 
Ich hab grad leider kein Delphi zur Hand. Aber ich meine ich habe schonmal ne ListBox mit mehreren Spalten gefüllt. Hab grad aber nicht im Kopf ob das die Standardkomponente war oder von TMS.

Medium 15. Aug 2012 13:28

AW: 2 dimensionales Array sortieren die X'te...
 
Ich meinte mit Liste auch weniger TStringList oder gar die visuellen Kompos, als viel mehr TList, TObjectList oder noch besser die generischen Vertreter in neueren Delphis. Das ist dann alles andere als dirty, sondern genau der Zweck, für den es diese gibt ;)

Aphton 15. Aug 2012 13:31

AW: 2 dimensionales Array sortieren die X'te...
 
Zitat:

Zitat von Satyr (Beitrag 1178359)
Zitat:

Zitat von himitsu (Beitrag 1178357)
unsichtbare ListBox = TStringList :roll:

Wofür gibts dann überhaupt Arrays?

Ist diese Frage ernst gemeint :wall:

Wie willst du ein Fahrrad ohne Räder fahren? Diese Komponente basieren intern ja auch auf Arrays (oder evt. verkettete Listen / was auch immer)
-.-'

Klaus01 15. Aug 2012 13:38

AW: 2 dimensionales Array sortieren die X'te...
 
Hallo,

was noch meiner Meinung nach noch nicht herausgekommen ist, nach welchen Kriterien überhaupt sortiert werden soll.

Gegeben z.B, ein 3x4 Array

Code:
  0  1  2  3
0 5  3  7  1 
1 4  2  2  3
2 9  7  4  5
Sollen dann die Zeilen oder Spalten sortiert werden?
Oder soll das alles als eine Zeile verstanden sein:
Code:
  5  3  7  1  4  2  2  3  9  7  4  5
Und diese dann sortiert werden?

Grüße
Klaus

Satyr 15. Aug 2012 14:52

AW: 2 dimensionales Array sortieren die X'te...
 
Es sollen die Zeilen nach einer Spalte voller Integer's sortiert werden.

Satyr 15. Aug 2012 17:10

AW: 2 dimensionales Array sortieren die X'te...
 
Ich habe es jetzt über eine ColumnListBix von TMS "gelöst". Nicht elegant, ich weiß. Eure Lösungen sind sicher besser. Aber ich steige da nicht durch, sobald es um mehrdimensionalität geht.
Trotzdem danke. Ich halte das alles im Hinterkopf und gucke mir das noch an wenn ich mehr Ruhe habe, damit ich sowas in Zukunft besser machen kann.


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