IComparer<T> = interface function Compare(const Left, Right: T): Integer; end; TComparer<T> = class(TInterfacedObject, IComparer<T>) public class function Default: IComparer<T>; class function Construct(const Comparison: TComparison<T>): IComparer<T>; function Compare(const Left, Right: T): Integer; virtual; abstract; end;
TComparison<T> = reference to function(const Left, Right: T): Integer;
TComparison<T> = reference to function(const Left, Right: T): Integer;
TList<T> = class(TEnumerable<T>)
// type TAppliedObjectList<T> = class(TList<T>) private type TSorting<T> = reference to function(var Values: array of T; const Comparer: IComparer<T>; Index, Count: Integer): Integer; var FCS: TCriticalSection; // FComparer: IComparer<T>; // Target: Array of T; // , // , <i>Private</i> public constructor Create; overload; constructor Create(const AComparer: IComparer<T>); overload; destructor Destroy; override; // // // , , <i>MaxInt</i> function SortBy<T>(const AProc: TSorting<T>): Integer; overload; end;
TSorting<T> = reference to function(var Values: array of T; const Comparer: IComparer<T>; Index, Count: Integer): Integer;
type // TSorting<T> TSorting<T> = reference to function(var Values: array of T; const Comparer: IComparer<T>; Index, Count: Integer): Integer; // , 100 TAllSort = class public // *** class function BubbleSort<T>(var Values: array of T; const Comparer: IComparer<T>; Index, Count: Integer): Integer; // *** class function QuickSort<T>(var Values: array of T; const Comparer: IComparer<T>; Index, Count: Integer): Integer; end;
procedure TfmMainTest.Button4Click(Sender: TObject); var // TAppliedObjectList<String> // , MyClass: TAppliedObjectList<String>; i: Integer; begin Memo1.Clear; try // , // // IComparer<T> MyClass := TAppliedObjectList<String>.Create(TComparer<String>.Default); try Memo1.Lines.Text := ' ' + sLineBreak + ' , .' + sLineBreak + ' ' + sLineBreak + ' .' + sLineBreak + ' ,' + sLineBreak + ' .' + sLineBreak + ' ,' + sLineBreak + ' , .' + sLineBreak + ' , ' + sLineBreak + ' .' + sLineBreak + ' , ' + sLineBreak + ' .'; // Memo for i := 0 to Memo1.Lines.Count - 1 do begin MyClass.Add(Memo1.Lines[i]); end; // "" i := MyClass.SortBy<String>(TAllSort.BubbleSort<String>); // Memo1.Lines.Add(sLineBreak + 'Turns: ' + i.ToString); // Memo1.Lines.Add(' :'); for i := 0 to MyClass.Count - 1 do begin Memo1.Lines.Add(MyClass.Items[i]); end; finally // , MyClass.Free; end; except on E: Exception do Memo1.Lines.Add(E.Message); end; end;
procedure TfmMainTest.Button3Click(Sender: TObject); var // TAppliedObjectList<TVector2D> // , TVector2D MyClass: TAppliedObjectList<TVector2D>; // TVector2D v: TVector2D; i: Integer; begin Memo1.Clear; try // , // // TAllComparison.Compare_TVector2D MyClass := TAppliedObjectList<TVector2D>.Create (TComparer<TVector2D>.Construct(TAllComparison.Compare_TVector2D)); try // 2D Memo1.Lines.Add(' :'); v.Create(10, 21); MyClass.Add(v); Memo1.Lines.Add(v.ToString); v.Create(-10, 20); MyClass.Add(v); Memo1.Lines.Add(v.ToString); v.Create(-10, -2); MyClass.Add(v); Memo1.Lines.Add(v.ToString); v.Create(-1, 7); MyClass.Add(v); Memo1.Lines.Add(v.ToString); // "" i := MyClass.SortBy<TVector2D>(TAllSort.QuickSort<TVector2D>); // Memo1.Lines.Add(sLineBreak + 'Turns: ' + i.ToString); // Memo1.Lines.Add(' :'); for i := 0 to MyClass.Count - 1 do begin Memo1.Lines.Add(MyClass.Items[i].ToString); end; finally // , if Assigned(MyClass) then MyClass.Free; end; except on E: Exception do Memo1.Lines.Add(E.Message); end; end;
Source: https://habr.com/ru/post/314780/
All Articles