AGB  ·  Datenschutz  ·  Impressum  







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

Liste von Records sortieren

Ein Thema von Maekkelrajter · begonnen am 8. Feb 2024 · letzter Beitrag vom 9. Feb 2024
Antwort Antwort
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
118 Beiträge
 
Delphi 11 Alexandria
 
#1

Liste von Records sortieren

  Alt 8. Feb 2024, 15:58
Gegeben sei eine Liste von Records:
Delphi-Quellcode:
Type

                     TMyRecord = Record
                         order : Integer;
                      position : Integer;
                           key : ansistring;
                                 end;

                 TMyRecordList = TList<TMyRecord>;


function ComparePosition(Item1, Item2: Pointer): Integer;
begin
  ????
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  MyRecordList.Sort(@ComparePosition);
end;
Diese Liste hat maximal 8 Einträge und soll nach 'position' sortiert werden. Das sollte eigentlich kein Problem sein. Aber ich kriege den Aufruf von TList.Sort bzw. ComparePosition um's Verrecken nicht hin! Oder geht das irgendwie ganz anders?
Ich brauche dringend einen Denkanstoß!

Gruß LP
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Liste von Records sortieren

  Alt 8. Feb 2024, 16:03
Jupp, sort sorttiert "binär",
aber willst du nach "logischem" Inhalt eines/mehrerer Felder des Records sortieren, dann brauchst du einen Comparer, welcher als Parameter an Sort übergeben wird.

Zitat:
In diesem Fall sind mußt du auch noch casten.
PMyRecord(Item1)^ oder
TMyRecord(Item1^)
[edit]
Wollte grade sagen, dass du besser die generische TList<> verwenden solltest,
aber tutst du ja schon.
Dann schau dir mal an, wie der Sort-Parameter definiert ist.

* ein Interface (IComparer)
* also nun eine Funktion suchen, welche ein IComarer zurückgibt und am Besten eine "Funktion" rein nimmt
* oder selber eine Klasse schreiben, welche IComarer implementiert
* oder eben nach einer fertigen Klasse für das Interface suchen, welche es implementiert (TComparer)
* dafür mußt du dir also eine Instanz erstellen (irgendwas mit "Construct") ... schau einfach mal in die Generics-Units.

[add]
Auf die Schnelle mal etwas für ein TArray<> gefunden, aber ist prinzipiell gleich.
Delphi-Quellcode:
  TArray.Sort<TComponent>(FFormDataSources, TComparer<TComponent>.Construct(function(const Left, Right: TComponent): Integer
    begin
      Result := CompareStr(Left.Name, Right.Name); //Nach Komponentname sortieren
    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 ( 8. Feb 2024 um 16:12 Uhr)
  Mit Zitat antworten Zitat
shebang
Online

Registriert seit: 7. Feb 2020
97 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Liste von Records sortieren

  Alt 8. Feb 2024, 16:59
Ich brauche dringend einen Denkanstoß!
Delphi-Quellcode:
MyRecordArray : TArray<TMyRecord>;

TArray.Sort<TMyRecord>(MyRecordArray, TComparer<TMyRecord>.Construct(
function(const Left, Right : TMyRecord) : Integer begin
  Result := TComparer<Integer>.Default.Compare(Left.position, Right.position);
end));
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Liste von Records sortieren

  Alt 8. Feb 2024, 17:03
Eigentlich für TList, aber OK.

PS: Delphi-Referenz durchsuchenCompareValue aus der System.Math
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.017 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Liste von Records sortieren

  Alt 8. Feb 2024, 20:14
Wenn der benötigte Platz im AnsiString nicht so groß ist, dann würde sogar schlicht das Ändern auf ShortString reichen.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Liste von Records sortieren

  Alt 8. Feb 2024, 20:55
Wenn der benötigte Platz im AnsiString nicht so groß ist, dann würde sogar schlicht das Ändern auf ShortString reichen.
Nicht wirklich. Bei einem Byte-Vergleich des Records würde erst nach order, dann nach position, dann nach der Länge des ShortStrings und dann nach seinem Inhalt verglichen. Gewünscht ist aber:
soll nach 'position' sortiert werden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.017 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Liste von Records sortieren

  Alt 8. Feb 2024, 21:00
Ach stimmt, und dann auch noch das Längenbyte! Danke für die Klärung.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Liste von Records sortieren

  Alt 8. Feb 2024, 21:16
Ein statisches #0-terminiertes Char-Array. (der Rest muß auch mit #0 gefüllt sein, wenn nachfolgend noch weitere Felder kommen)

Aber so schwer ist das mit dem Comparer nicht unbedingt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
118 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Liste von Records sortieren

  Alt 9. Feb 2024, 11:05
Aber so schwer ist das mit dem Comparer nicht unbedingt.
Für mich schon.
Nach langem Suchen und vielen Versuchen funktioniert's nun so:
Delphi-Quellcode:
    
    MyRecordList.Sort(IComparer<TMyRecord>(
    function(const L, R: TMyRecord): Integer
    begin
      Result := CompareValue(L.position, R.position);
    end));
Danke an alle für die 'Denkanstöße'.

Gruß LP
  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 09:57 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