AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array sortieren

Ein Thema von michael.cohrs · begonnen am 25. Jul 2017 · letzter Beitrag vom 25. Jul 2017
Antwort Antwort
Seite 1 von 3  1 23      
michael.cohrs

Registriert seit: 11. Nov 2005
Ort: Hamburg
130 Beiträge
 
#1

Array sortieren

  Alt 25. Jul 2017, 08:56
Hallo zusammen,

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

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
Michael Cohrs
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#2

AW: Array sortieren

  Alt 25. Jul 2017, 09:16
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#3

AW: Array sortieren

  Alt 25. Jul 2017, 09:17
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.
Delphi-Quellcode:
TArray.Sort<TRec>(RecArray,
  function(const Left, Right: TRec): Integer
    begin
      result := CompareDateTime(Left.Datum, Right.Datum);
    end);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Jul 2017 um 09:19 Uhr)
  Mit Zitat antworten Zitat
michael.cohrs

Registriert seit: 11. Nov 2005
Ort: Hamburg
130 Beiträge
 
#4

AW: Array sortieren

  Alt 25. Jul 2017, 09:40
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
Michael Cohrs
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Array sortieren

  Alt 25. Jul 2017, 09:42
Wenn mich nicht alles täuscht müsste es so funktionieren:

if ArrAngKps[j].CrtDatum > ArrAngKps[j + 1].CrtDatum then // if ArrAngKps[J].CrtDatum statt if ArrAngKps[I].CrtDatum
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#6

AW: Array sortieren

  Alt 25. Jul 2017, 09:46
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Jul 2017 um 09:49 Uhr)
  Mit Zitat antworten Zitat
michael.cohrs

Registriert seit: 11. Nov 2005
Ort: Hamburg
130 Beiträge
 
#7

AW: Array sortieren

  Alt 25. Jul 2017, 09:48
das habe ich in dem ersten Beispiel versucht ( if ArrAngKps[j].CrtDatum > ArrAngKps[j + 1].CrtDatum then)
Michael Cohrs
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#8

AW: Array sortieren

  Alt 25. Jul 2017, 09:56
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
j := ... to high(ArrAngKps) und 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Jul 2017 um 10:13 Uhr)
  Mit Zitat antworten Zitat
michael.cohrs

Registriert seit: 11. Nov 2005
Ort: Hamburg
130 Beiträge
 
#9

AW: Array sortieren

  Alt 25. Jul 2017, 10:18
Ich versteh nichts mehr.....könnte mir bitte jemand für das Beispiel einen funktionierenden CodeSnipsel senden?

Michael Cohrs
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: Array sortieren

  Alt 25. Jul 2017, 11:03
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;

Geändert von nahpets (25. Jul 2017 um 16:52 Uhr) Grund: Schreibfehler behoben
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 22:22 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