Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Array sortieren (https://www.delphipraxis.net/193392-array-sortieren.html)

michael.cohrs 25. Jul 2017 08:56

Array sortieren
 
Hallo zusammen,

ich weiß, dieses Thema ist so alt und sooft diskutiert worden wie nix gutes, dennoch steh ich auf dem Schlauch:oops:

ich habe ein Array of Record, in diesem sind folgende Beispielhafte Daten:

- Datum (als TDatetime)
- Kunde (als String)
- Nummer(als Integer)
.
.
.

ich möchte dieses Array nun nach dem element Datum sortieren, das neuste Datum soll als erster Eintrag ersichtlich sein.

ICH KRIEGS NICHT HIN....

Mag mir jemand helfen oder einen codesnipsel zukommen lassen?

vielen Dank

Michael

Uwe Raabe 25. Jul 2017 09:16

AW: Array sortieren
 
Delphi-Quellcode:
uses
  System.Generics.Collections, System.Generics.Defaults, System.DateUtils;

type
  TRec = record
    Datum: TDateTime;
    Kunde: string;
    Nummer: Integer;
  end;

  TRecArray = TArray<TRec>;

procedure SortByDate(var RecArray: TRecArray);
begin
  TArray.Sort<TRec>(RecArray,
    TDelegatedComparer<TRec>.Create(
      function(const Left, Right: TRec): Integer
      begin
        result := CompareDateTime(Left.Datum, Right.Datum);
      end));
end;

himitsu 25. Jul 2017 09:17

AW: Array sortieren
 
Wo genau liegt nun das Problem
und wie sieht dein aktueller Versuch aus?


* das Sortieren des Arrays (das Tauschen/Verschieben der Items)

* das Vergleichen zweier Items?
** Hier zuerst das Hauptkriterium (Datum) vergleichen und "nur" wenn das gleich ist, dann jeweils das nächste Kriterium (Kunde, Nummer, ...) vergleichen, und sozusagen jeweils den ersten Unterschied zum Sortieren verwenden.



Zitat:

Delphi-Quellcode:
TArray.Sort<TRec>(RecArray,
    TDelegatedComparer<TRec>.Create

Warum auch immer noch keiner auf die kranke Idee kam und den TDelegatedComparer in eine Überladung zu verschieben. :wall:
Delphi-Quellcode:
TArray.Sort<TRec>(RecArray,
  function(const Left, Right: TRec): Integer
    begin
      result := CompareDateTime(Left.Datum, Right.Datum);
    end);

michael.cohrs 25. Jul 2017 09:40

AW: Array sortieren
 
Hallo und Danke für die Antworten,


folgende Lösungsansätze habe ich versuche:

Delphi-Quellcode:
  for i := low(ArrAngKps) to Pred(high(ArrAngKps)) do
    for j := succ(i) to high(ArrAngKps) do
      if ArrAngKps[j].CrtDatum > ArrAngKps[j + 1].CrtDatum then
      Begin
        TmpAng          := ArrAngKps[i];
        ArrAngKps[i]    := ArrAngKps[j];
        ArrAngKps[j]    := TmpAng;
      end;

  for i := 0 to length(ArrAngKps) - 1 do
  Begin
    for j := 0 to length(ArrAngKps) - 2 do
    begin
      if ArrAngKps[i].CrtDatum > ArrAngKps[j + 1].CrtDatum then
      Begin
        TmpAng          := ArrAngKps[j];
        ArrAngKps[j]    := ArrAngKps[j + 1];
        ArrAngKps[j + 1] := TmpAng;
      end;
    end;
  end;
aber das Array wird nicht sortiert :-(

ich muss leider Delphi 6 nutzen

Neutral General 25. Jul 2017 09:42

AW: Array sortieren
 
Wenn mich nicht alles täuscht müsste es so funktionieren:

Delphi-Quellcode:
if ArrAngKps[j].CrtDatum > ArrAngKps[j + 1].CrtDatum then //  if ArrAngKps[J].CrtDatum statt if ArrAngKps[I].CrtDatum

himitsu 25. Jul 2017 09:46

AW: Array sortieren
 
Joar, erstmal die falsche Variable, was dem ersten Punkt entspricht.
Zitat:

* das Sortieren des Arrays (das Tauschen/Verschieben der Items)

Und dann noch der zweite Punkt. (wenn Punkt 1 dann erstmal mit einem Kriterium funktioniert, den Vergleich entsprechend erweitern)
Zitat:

* das Vergleichen zweier Items?
** Hier zuerst das Hauptkriterium (Datum) vergleichen und "nur" wenn das gleich ist, dann jeweils das nächste Kriterium (Kunde, Nummer, ...) vergleichen, und sozusagen jeweils den ersten Unterschied zum Sortieren verwenden.

michael.cohrs 25. Jul 2017 09:48

AW: Array sortieren
 
das habe ich in dem ersten Beispiel versucht ( if ArrAngKps[j].CrtDatum > ArrAngKps[j + 1].CrtDatum then)

himitsu 25. Jul 2017 09:56

AW: Array sortieren
 
In Projektoptionen bitte mal Indexprüfung aktivieren.
Zitat:

Delphi-Quellcode:
for i := low(ArrAngKps) to Pred(high(ArrAngKps)) do
  for j := succ(i) to high(ArrAngKps) do
    if ArrAngKps[j].CrtDatum > ArrAngKps[j + 1].CrtDatum then

Delphi-Quellcode:
j := ... to high(ArrAngKps)
und
Delphi-Quellcode:
ArrAngKps[j + 1]
muß zwangsläufig knallen.
High+1 ist nicht mehr im Array drin.


Außerdem vergleichst du dort J mit J+1, aber tauschst I mit J.
Und im zweiten Versuch verlgichst du I mit J, aber tauschst J mit J+1.
Man sollte da natürlich nur das tauschen, was vorher auch verglichen wurde, da sonst das Vergleichsergebnis nicht unbedingt zu den getauschten Items passt.

michael.cohrs 25. Jul 2017 10:18

AW: Array sortieren
 
Ich versteh nichts mehr.....könnte mir bitte jemand für das Beispiel einen funktionierenden CodeSnipsel senden?

:pale:

nahpets 25. Jul 2017 11:03

AW: Array sortieren
 
Delphi-Quellcode:
  for i := low(ArrAngKps) to Pred(high(ArrAngKps)) do
    for j := succ(i) to high(ArrAngKps) do
      if ArrAngKps[j].CrtDatum > ArrAngKps[j + 1].CrtDatum // wenn j = high(ArrAngKps) ist, gibt es j + 1 nicht.
      then
      Begin
        TmpAng := ArrAngKps[i];
        ArrAngKps[i] := ArrAngKps[j];
        ArrAngKps[j] := TmpAng;
      end;

  for i := 0 to length(ArrAngKps) - 1 do
  Begin
    for j := 0 to length(ArrAngKps) - 2 do
    begin
      if ArrAngKps[i].CrtDatum > ArrAngKps[j + 1].CrtDatum then
      Begin
        // Warum j und j + 1 tauschen, wenn i und j + 1 verglichen wurden?
        TmpAng := ArrAngKps[j];
        ArrAngKps[j] := ArrAngKps[j + 1];
        ArrAngKps[j + 1] := TmpAng;
      end;
    end;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.
Seite 1 von 3  1 23      

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