AGB  ·  Datenschutz  ·  Impressum  







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

Sortieren eines Array of record

Ein Thema von ebi · begonnen am 8. Sep 2024 · letzter Beitrag vom 13. Sep 2024
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 15:29
+1?
und Low+1 aka 0+1 aka immer 1?

[edit] AAAAAAHH, I nicht 1 ... schwer zu erkennen. PS: Darum verwende ich immer nur das keine i, auch wenn ich alle anderen einbuchstabigen Variablen ebenfalls groß schreibe.
Delphi-Quellcode:
for var I := 0 to High(Result) do
  Result[I] := Value[I];
param: array of ... sollte immer mit 0 beginnen, egal was reingegeben wurde.



warum nicht?
Delphi-Quellcode:
FUNCTION TCodeSorted(Value: TArray<TCode>): TArray<TCode>;
begin
  Result := Value;
oder direkt
Delphi-Quellcode:
procedure TCodeSorted(var Value: TArray<TCode>);
begin
[edit] Ahhh OK, die statischen Arrays.
Wobei man es inzwischen auch direkt dynamische Konstanten und Variablen deklarieren kann.
Delphi-Quellcode:
const // oder var
  GCodeB: array of TCode = [
    ...
  ];



Wenn "Wort" nicht eindeutig ist und somit auch noch nach Bezeichnung sortiert werden müsste.
Delphi-Quellcode:
    begin
      Result := string.Compare(Left.Wort, Right.Wort, [coDigitAsNumbers]);
      if Result = 0 then
        Result := string.Compare(Left.Bezeichnung, Right.Bezeichnung, [coDigitAsNumbers]);
    end));
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Sep 2024 um 15:54 Uhr)
  Mit Zitat antworten Zitat
ebi

Registriert seit: 8. Sep 2024
11 Beiträge
 
Delphi 12 Athens
 
#2

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 15:37
hallo himitsu,

vielen Dank, ich werde versuchen Dein Delphi-CODE zu erlernen.

HG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 15:48
Das "Warum" ignorieren ... hab ich oben editiert/geändert.

Aber bei dem +1 weist du ja immer das zweite Array-Item deinem Result zu.
Tipp: mit dem Debugger mal ansehen, was in der Result-Variable nach deiner Schleife drin steht.





Schön ist es auch, wenn man Gleiches Zusammengehöriges zusammenfasst.
So kann z.B. der Record selbst seine eigene Sortierfunktion bereitstellen.

Delphi-Quellcode:
type
  TCode = record
    Wort: string;
    Bezeichnung: string;
    class function Compare(const Left, Right: TCode): Integer; static;
  end;

// das Class+Static ist dafür, damit es kein implizites SELF gibt (als ersten unsichtbaren Parameter), also genauso, als wäre die Methode nicht in einer Klasse/Record.
class function TCode.Compare(const Left, Right: TCode): Integer;
begin
  Result := string.Compare(Left.Wort, Right.Wort, [coDigitAsNumbers]);
end;


TArray.Sort<TCode>(Self.TAdresse, TDelegatedComparer<TCode>.Create(TCode.Compare));


PS: Der Name mit T ist schon ein bissl verwirrend ... klingt irgendwie nicht nach Feld/Variable, sondern mehr nach Typ/Klasse.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Sep 2024 um 15:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 16:03
Wobei man es inzwischen auch direkt dynamische Konstanten und Variablen deklarieren kann.
Delphi-Quellcode:
const // oder var
  GCodeB: array of TCode = [
    ...
  ];
Wird nicht so einfach mit einem array of record...
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
44.340 Beiträge
 
Delphi 12 Athens
 
#5

AW: Sortieren eines Array of record

  Alt 8. Sep 2024, 16:07
OK, vor allem in Bezug auf Records gibt es hier immer mal wieder Verwirrungen, bei der Deklaration.
https://quality.embarcadero.com/brow...ord%20const%22

Aber meistens oft lässt es sich schon verwenden, abgesehn von anderen Dingen.
https://embt.atlassian.net/servicede...tal/1/RSS-1691
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Sep 2024 um 16:21 Uhr)
  Mit Zitat antworten Zitat
ebi

Registriert seit: 8. Sep 2024
11 Beiträge
 
Delphi 12 Athens
 
#6

AW: Sortieren eines Array of record

  Alt 9. Sep 2024, 14:23
Hallo Zusammen,

Euer Profi Delphi-CODE ist schon eine starke Sache, nur für mich nicht klar,
wo was jetzt genau hinkommt.

Vielen Dank.

HG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Sortieren eines Array of record

  Alt 9. Sep 2024, 15:20
Echt jetzt? Dabei wurde hier alles extra erklärt und in mehreren Beispielen gezeigt.
siehe Antworten # oder, #6. Und in #7 hast du sie sogar selbst schon benutzt?

Das TArray.Sort<...>(...); , aus der Unit System.Generics.Collections, ist die Prozedur zum Sortieren.
Da geht das Array rein und kommt soritert wieder raus.
https://docwiki.embarcadero.com/Libr...ns.TArray.Sort

Damit sie weiß wie hier sortiert werden muß, bekommt sie zusätzlich noch eine Verleichs-Funktion rein.
Das kann eine einfache Funktion sein, oder eine Objekt-Methode, eine Klassen-Methode, eine statische Klassen-Methode, eine anonyme Methode oder auch eine eigene Klasse+Interface.
Wie diese Vergleichsfunktion aussehen kann, siehe #2, #6 oder #8.

Für sowas wie TArray<Integer> oder TArray<String> kann man die Vergleichsfunktion auch weglassen, da es hierfür einen Default-Comparer gibt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Sortieren eines Array of record

  Alt 9. Sep 2024, 16:36
Echt jetzt? Dabei wurde hier alles extra erklärt und in mehreren Beispielen gezeigt.
Na ja, es kommt halt darauf an, wo man jemanden abholen muss. Wenn man schon länger mit Delphi programmiert, mag das alles schnell ersichtlich sein, aber für einen Anfänger kann das schon eine gewisse Herausforderung darstellen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
ebi

Registriert seit: 8. Sep 2024
11 Beiträge
 
Delphi 12 Athens
 
#9

AW: Sortieren eines Array of record

  Alt 9. Sep 2024, 17:11
Hallo,

Danke für Euer Verständnis, hier mal mein Delphi-CODE.

Delphi-Quellcode:
FUNCTION TCodeSorted(Value: array of TCode): TArray<TCode>;
begin
  SetLength(Result, Length(Value));
  for var I := 0 to High(Result) do
    Result[I] := Value[I];
  TArray.Sort<TCode>(Result, TDelegatedComparer<TCode>.Create(
    FUNCTION(const Left, Right: TCode): integer
    begin
      Result := string.Compare(Left.Wort, Right.Wort, [coDigitAsNumbers]);
    end));
end;
Delphi-Quellcode:
  // TSteuerung: PAL
  begin
    Pal := TSteuerung.Create('PAL');
    SetLength(Pal.Nullpunkt, 6);
    Pal.Nullpunkt[0] := 'G54';
    Pal.Nullpunkt[1] := 'G55';
    Pal.Nullpunkt[2] := 'G56';
    Pal.Nullpunkt[3] := 'G57';
    Pal.Nullpunkt[4] := 'G58';
    Pal.Nullpunkt[5] := 'G59';
    SetLength(Pal.Parameter, 0);

    // GCodeB nach TArray sortiert und in TSteuerung
    begin
      lLength := Length(GCodeB);
      SetLength(TArray, lLength);
      SetLength(Pal.Wegbedingung, lLength);

      arr := TCodeSorted(GCodeB);
      Zaehler := 0;
      for var rec in arr do
        begin
          TArray[Zaehler].Wort := rec.Wort;
          TArray[Zaehler].Bezeichnung := rec.Bezeichnung;
          Pal.Wegbedingung[Zaehler].Wort := TArray[Zaehler].Wort;
          Pal.Wegbedingung[Zaehler].Bezeichnung := TArray[Zaehler].Bezeichnung;
          Zaehler := Zaehler + 1;
        end;
    end;
  end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:50 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