![]() |
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 |
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; |
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,
function(const Left, Right: TRec): Integer begin result := CompareDateTime(Left.Datum, Right.Datum); end); |
AW: Array sortieren
Hallo und Danke für die Antworten,
folgende Lösungsansätze habe ich versuche:
Delphi-Quellcode:
aber das Array wird nicht sortiert :-(
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; ich muss leider Delphi 6 nutzen |
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
|
AW: Array sortieren
Joar, erstmal die falsche Variable, was dem ersten Punkt entspricht.
Zitat:
Und dann noch der zweite Punkt. (wenn Punkt 1 dann erstmal mit einem Kriterium funktioniert, den Vergleich entsprechend erweitern) Zitat:
|
AW: Array sortieren
das habe ich in dem ersten Beispiel versucht ( if ArrAngKps[j].CrtDatum > ArrAngKps[j + 1].CrtDatum then)
|
AW: Array sortieren
In Projektoptionen bitte mal Indexprüfung aktivieren.
Zitat:
Delphi-Quellcode:
und
j := ... to high(ArrAngKps)
Delphi-Quellcode:
muß zwangsläufig knallen.
ArrAngKps[j + 1]
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. |
AW: Array sortieren
Ich versteh nichts mehr.....könnte mir bitte jemand für das Beispiel einen funktionierenden CodeSnipsel senden?
:pale: |
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 01:16 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