AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ersetzen der privaten class procedure QuickSort<T> (. . .) der Klasse TArray
Thema durchsuchen
Ansicht
Themen-Optionen

Ersetzen der privaten class procedure QuickSort<T> (. . .) der Klasse TArray

Ein Thema von Andreas13 · begonnen am 29. Feb 2016 · letzter Beitrag vom 1. Mär 2016
Antwort Antwort
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
730 Beiträge
 
Delphi XE5 Professional
 
#1

AW: Ersetzen der privaten class procedure QuickSort<T> (. . .) der Klasse TArray

  Alt 29. Feb 2016, 18:28
danke Uwe und Stefan für die Aufklärung und die Erklärung des Unterschiedes zwischen den beiden Typen.

Mein ursprüngliches Ziel war es, anstelle meiner x typ-spezifischen Sortierroutinen EINE einzige Routine zu verwenden, die ALLE Array-Typen "schluckt". Dazu hat mich TArray.QuickSort<T> inspiriert. Als ersten Schritt wollte ich dazu als "schnelle" Lösung ein abgeleitetes Objekt a la oben aufgeführten Quellcode benutzen. Denn auch ich habe bemerkt, dass TArray.QuickSort<T> intern auf eine ziemlich komplexe Weise mit aller Welt verknüpft ist. Als zweiten Schritt wollte ich schließlich ein eigenes typ-unabhängiges Objekt erstellen...

Lässt sich mit objektorientiertem Ansatz eine solche Routine - ohne Pointer-Akrobatik - programmieren, die ALLE Array-Inhalte verarbeiten kann? Bisher habe ich - prozedural - meistens mit "overload" gearbeitet.

Gruß, Andreas

Geändert von Andreas13 (29. Feb 2016 um 18:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Ersetzen der privaten class procedure QuickSort<T> (. . .) der Klasse TArray

  Alt 29. Feb 2016, 18:40
TArray.Sort<T> arbeitet doch schon mit Arrays beliebigen Typs.

Delphi-Quellcode:
var
  intarr: TArray<Integer>;
  strArr: TArray<string>;
begin
  TArray.Sort<Integer>(intArr);
  TArray.Sort<string>(strArr);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.210 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Ersetzen der privaten class procedure QuickSort<T> (. . .) der Klasse TArray

  Alt 29. Feb 2016, 19:00
Wenn du beispielsweise ein Array von Records oder sonstwas sortieren willst kannst du bei TArray.Sort auch einen IComparer<T> angeben. Siehe Doku

Sieht dann, etwas länglich, so aus:

Delphi-Quellcode:
program Project11;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.Generics.Collections, System.Generics.Defaults;

type
   TMyRecord = record
      alsWort:   String;
      alsZahl:   Integer;
   end;

var
   a, b, c:   TMyRecord;
   comparer:   IComparer<TMyRecord>;
   meinArray:   TArray<TMyRecord>;
begin
   a.alsWort := 'Dreiundzwanzsch'; a.alsZahl := 23;
   b.alsWort := 'Nüscht'; b.alsZahl := 0;
   c.alsWort := 'Sievenunfünfzsch'; c.alsZahl := 57;

   comparer := TComparer<TMyRecord>.Construct(
      function(const left, right: TMyRecord): Integer
      begin
         Result := TComparer<Integer>.Default.Compare(left.alsZahl, right.alsZahl);
      end
   );

   SetLength(meinArray, 3); meinArray[0] := a; meinArray[1] := b; meinArray[2] := c;
   // Ab XE7 ginge stattdessen auch das hier:
   //meinArray := [a, b, c];

   TArray.Sort<TMyRecord>(meinArray, comparer);

   WriteLn(meinArray[0].alsWort);
   WriteLn(meinArray[1].alsWort);
   WriteLn(meinArray[2].alsWort);
   ReadLn;
end.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
730 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Ersetzen der privaten class procedure QuickSort<T> (. . .) der Klasse TArray

  Alt 29. Feb 2016, 22:08
Hallo zusammen,

danke für die vielen nützlichen Tipps, Hinweise und Anregungen: ich habe dabei von EUCH eine ganze Menge gelernt und Vieles ist mir klar geworden!

Mit diesem soeben erworbenen Know-how konnte ich sogar meine ursprüngliche Routine realisieren und TArray.QuickSort(. . .) in den ABGELEITETEN Klassen auf „meine“ Sortierroutine umbiegen.

Hier ist das Ergebnis, falls sich jemand dafür interessieren sollte:

Delphi-Quellcode:
unit Test_TArray_QuickSort;

interface

uses
   System.Generics.Collections
, System.Generics.Defaults
;

type
  MyTArray = class(TArray)
  private
    class procedure QuickSort<T>(var Values: array of T; const Comparer: IComparer<T>;
      L, R: Integer);
  public
    class procedure Sort<T>(var Values: array of T); // !!
  end;

implementation

class procedure MyTArray.QuickSort<T>(var Values: array of T; const Comparer: IComparer<T>;
  L, R: Integer);
Begin
// hier soll die neue QuickSort-Routine folgen:
End;

class procedure MyTArray.Sort<T>(var Values: array of T);
begin
  QuickSort<T>(Values, TComparer<T>.Default, Low(Values), High(Values));
end;

Und das Testprogramm:
program Sortieren_0_verbessert;

{$APPTYPE CONSOLE}

{$R *.res}


uses
  System.SysUtils
, System.Generics.Collections
, Test_TArray_QuickSort in 'Test_TArray_QuickSort.pas';

VAR
  S : String;
  MyArr: TArray<String>; // !!!


Begin
   MyArr:= TArray<String>.Create('things', 'SOME', 'some', 'THINGS');
   SetLength(MyArr, 5);
   MyArr[4]:='Irgend etwas';
   MyTArray.Sort<String>(MyArr);

   For S in MyArr Do Write(S, ' ');
   WriteLn;

   ReadLn;
End.
Herzlichen Dank an Euch Alle!

Gruß, Andreas

Geändert von Phoenix ( 1. Mär 2016 um 11:51 Uhr) Grund: Delphi-Tags eingefügt. Das nächste mal bitte selber machen.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.644 Beiträge
 
#5

AW: Ersetzen der privaten class procedure QuickSort<T> (. . .) der Klasse TArray

  Alt 1. Mär 2016, 11:53
Andreas, bitte achte in Zukunft darauf in Deinen Posts den Quellcode mit [delphi]-tags zu umschliessen, damit dieser auch richtig formatiert wird.
Das habe ich jetzt gemacht, weil es Beschwerden von Usern gab die das schlecht lesen konnten, aber für die Zukunft bitte selber daran denken, ja?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
730 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Ersetzen der privaten class procedure QuickSort<T> (. . .) der Klasse TArray

  Alt 1. Mär 2016, 12:39
Sorry Sebastian für meine Unerfahrenheit, und danke für Deine Hilfe! Nächstes Mal werde ich es besser machen.

Gruß, Andreas

Geändert von Andreas13 ( 1. Mär 2016 um 16:20 Uhr)
  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 06:25 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