乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      泛型排序器 TComparer

       獨孤求財 2012-03-30
      測試代碼文件:
      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
      

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多