測試代碼文件:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; Button10: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button10Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses Generics.Collections, Generics.Defaults; {必需的泛型單元} //構(gòu)建由 10 個整數(shù)組成的動態(tài)數(shù)組, 然后排序 procedure TForm1.Button1Click(Sender: TObject); var arr: array of Integer; i: Integer; begin {構(gòu)建動態(tài)數(shù)組} Randomize; for i := 0 to 9 do begin SetLength(arr, Length(arr)+1); arr[i] := Random(10); end; {顯示排序前} Memo1.Clear; for i := 0 to Length(arr) - 1 do Memo1.Lines.Add(IntToStr(arr[i])); {排序} TArray.Sort<Integer>(arr); {它可以有 1個、2個、4個參數(shù), 這里只用了一個參數(shù), 其他是默認參數(shù)} {顯示排序結(jié)果} Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(IntToStr(arr[i])); end; // TArray.Sort 的第二個參數(shù)是 IComparer<T> 類型, 其默認值是: TComparer<T>.Default procedure TForm1.Button2Click(Sender: TObject); var arr: array of Integer; i: Integer; begin Randomize; for i := 0 to 9 do begin SetLength(arr, Length(arr)+1); arr[i] := Random(10); end; Memo1.Clear; for i := 0 to Length(arr) - 1 do Memo1.Lines.Add(IntToStr(arr[i])); {使用了排序器的默認值排序, 這和忽略這個參數(shù)是一樣的} TArray.Sort<Integer>(arr, TComparer<Integer>.Default); Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(IntToStr(arr[i])); end; //同上兩例, 變通了一下寫法 procedure TForm1.Button3Click(Sender: TObject); var arr: array of Integer; i: Integer; Comparer: IComparer<Integer>; begin Randomize; for i := 0 to 9 do begin SetLength(arr, Length(arr)+1); arr[i] := Random(10); end; Memo1.Clear; for i := 0 to Length(arr) - 1 do Memo1.Lines.Add(IntToStr(arr[i])); Comparer := TComparer<Integer>.Default; TArray.Sort<Integer>(arr, Comparer); Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(IntToStr(arr[i])); end; // TArray.Sort 的后面兩個參數(shù)可以指定排序范圍: procedure TForm1.Button4Click(Sender: TObject); var arr: array of Integer; i: Integer; Comparer: IComparer<Integer>; begin Randomize; for i := 0 to 9 do begin SetLength(arr, Length(arr)+1); arr[i] := Random(10); end; Memo1.Clear; for i := 0 to Length(arr) - 1 do Memo1.Lines.Add(IntToStr(arr[i])); Comparer := TComparer<Integer>.Default; {這里指定從第 1 個元素開始, 只給 3 個元素排序} TArray.Sort<Integer>(arr, Comparer, 0, 3); Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(IntToStr(arr[i])); end; //如果要倒排序, 可以建立自己的排序器, 下面就是先構(gòu)建并實現(xiàn)了一個 TMyComparer, 然后調(diào)用: type TMyComparer = class(TComparer<Integer>) public function Compare(const Left, Right: Integer): Integer; override; end; { TMyComparer } function TMyComparer.Compare(const Left, Right: Integer): Integer; begin Result := Right - Left; end; procedure TForm1.Button5Click(Sender: TObject); var arr: array of Integer; i: Integer; Comparer: TMyComparer; begin Randomize; for i := 0 to 9 do begin SetLength(arr, Length(arr)+1); arr[i] := Random(10); end; Memo1.Clear; for i := 0 to Length(arr) - 1 do Memo1.Lines.Add(IntToStr(arr[i])); Comparer := TMyComparer.Create; TArray.Sort<Integer>(arr, Comparer); Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(IntToStr(arr[i])); Comparer.Free; end; // 也可以用 TComparer<T>.Construct 方法, 通過一個 TComparison 格式的函數(shù)構(gòu)建排序器, 這樣簡單一些 function MyFunc1(const Left, Right: Integer): Integer; begin Result := Right - Left; end; procedure TForm1.Button6Click(Sender: TObject); var arr: array of Integer; i: Integer; Comparer: IComparer<Integer>; begin Randomize; for i := 0 to 9 do begin SetLength(arr, Length(arr)+1); arr[i] := Random(10); end; Memo1.Clear; for i := 0 to Length(arr) - 1 do Memo1.Lines.Add(IntToStr(arr[i])); Comparer := TComparer<Integer>.Construct(MyFunc1); TArray.Sort<Integer>(arr, Comparer); Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(IntToStr(arr[i])); end; //如果是給自定義類型的元素排序, 只能是自建排序器 type TPerson = record name: string; age: Word; end; function MyFunc2(const Left, Right: TPerson): Integer; begin Result := Left.age - Right.age; end; procedure TForm1.Button7Click(Sender: TObject); var arr: array of TPerson; i: Integer; Comparer: IComparer<TPerson>; begin SetLength(arr, 4); arr[0].name := 'AA'; arr[0].age := 22; arr[1].name := 'BB'; arr[1].age := 33; arr[2].name := 'CC'; arr[2].age := 44; arr[3].name := 'DD'; arr[3].age := 11; Memo1.Clear; for i := 0 to Length(arr) - 1 do Memo1.Lines.Add(Format('%s : %d', [arr[i].name, arr[i].age])); Comparer := TComparer<TPerson>.Construct(MyFunc2); TArray.Sort<TPerson>(arr, Comparer); Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(Format('%s : %d', [arr[i].name, arr[i].age])); end; // TStringComparer.Ordinal 是官方實現(xiàn)的用于 string 的排序器, 可直接使用. //但它好像有問題(Delphi 2010 - 14.0.3513.24210), 以后的版本應(yīng)該能改過來. procedure TForm1.Button8Click(Sender: TObject); var arr: array of string; i: Integer; begin SetLength(arr, 4); arr[0] := '222'; arr[1] := '111'; arr[2] := 'bbb'; arr[3] := 'aaa'; Memo1.Clear; for i := 0 to Length(arr) - 1 do Memo1.Lines.Add(arr[i]); TArray.Sort<string>(arr, TStringComparer.Ordinal); Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(arr[i]); end; //下面是實現(xiàn)字符串數(shù)組的到排序 function MyComparerFunc(const s1,s2: string): Integer; begin Result := CompareText(s2, s1); //Result := -CompareText(s1, s2); {或者這樣} end; procedure TForm1.Button9Click(Sender: TObject); var arr: array of string; i: Integer; Comparer: IComparer<string>; begin Memo1.Clear; Memo1.Lines.CommaText := '11,33,22,AAA,CCC,BBB'; SetLength(arr, Memo1.Lines.Count); for i := 0 to Length(arr) - 1 do arr[i] := Memo1.Lines[i]; Comparer := TComparer<string>.Construct(MyComparerFunc); TArray.Sort<string>(arr, Comparer); Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(arr[i]); end; //可以把上一個程序簡寫為: procedure TForm1.Button10Click(Sender: TObject); var arr: array of string; i: Integer; Comparer: IComparer<string>; begin Memo1.Clear; Memo1.Lines.CommaText := '11,33,22,AAA,CCC,BBB'; SetLength(arr, Memo1.Lines.Count); for i := 0 to Length(arr) - 1 do arr[i] := Memo1.Lines[i]; Comparer := TComparer<string>.Construct( function (const s1,s2: string): Integer begin Result := CompareText(s2, s1); end); TArray.Sort<string>(arr, Comparer); Memo2.Clear; for i := 0 to Length(arr) - 1 do Memo2.Lines.Add(arr[i]); end; end. 測試窗體文件(之所以附上窗體文件, 是為了再次測試方便): object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 321 ClientWidth = 318 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Memo1: TMemo Left = 0 Top = 0 Width = 89 Height = 321 Align = alLeft Lines.Strings = ( 'Memo1') TabOrder = 0 ExplicitHeight = 299 end object Button1: TButton Left = 120 Top = 8 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 1 OnClick = Button1Click end object Button2: TButton Left = 120 Top = 39 Width = 75 Height = 25 Caption = 'Button2' TabOrder = 2 OnClick = Button2Click end object Button3: TButton Left = 120 Top = 70 Width = 75 Height = 25 Caption = 'Button3' TabOrder = 3 OnClick = Button3Click end object Memo2: TMemo Left = 219 Top = 0 Width = 99 Height = 321 Align = alRight Lines.Strings = ( 'Memo2') TabOrder = 4 ExplicitHeight = 299 end object Button4: TButton Left = 120 Top = 101 Width = 75 Height = 25 Caption = 'Button4' TabOrder = 5 OnClick = Button4Click end object Button5: TButton Left = 120 Top = 132 Width = 75 Height = 25 Caption = 'Button5' TabOrder = 6 OnClick = Button5Click end object Button6: TButton Left = 120 Top = 163 Width = 75 Height = 25 Caption = 'Button6' TabOrder = 7 OnClick = Button6Click end object Button7: TButton Left = 120 Top = 194 Width = 75 Height = 25 Caption = 'Button7' TabOrder = 8 OnClick = Button7Click end object Button8: TButton Left = 120 Top = 225 Width = 75 Height = 25 Caption = 'Button8' TabOrder = 9 OnClick = Button8Click end object Button9: TButton Left = 120 Top = 256 Width = 75 Height = 25 Caption = 'Button9' TabOrder = 10 OnClick = Button9Click end object Button10: TButton Left = 120 Top = 287 Width = 75 Height = 25 Caption = 'Button10' TabOrder = 11 OnClick = Button10Click end end |
|