Delphi 使用TArray.Sort對數組排序


默認排序比較類
您可以使用TArray.Sort對數組進行排序。
 
對數字數組進行排序的示例
uses
  System.Generics.Collections, System.Generics.Defaults;
var
  Values: array[0..8] of Integer = (1,3,5,7,9,8,6,2,4);
  I: Integer;
begin
  TArray.Sort<Integer>(Values);
  for I in Values do
    Write(I);
end.

 

執行結果
 
123456789
 
字符串數組排序示例
uses
  System.Generics.Collections, System.Generics.Defaults;
var
  Values: array[0..3] of string = ('Carol', 'Bob', 'Alice', 'Dave');
  S: string;
begin
  TArray.Sort<string>(Values);
  for S in Values do
    WriteLn(S);
end.

執行結果

 
Alice
Bob
Carol
Dave
通過在繼承自IComparer的類中指定比較方法來進行排序
通過將繼承IComparer的類指定為TArray.Sort的第二個參數,可以在任何條件下對數組進行排序。
 
//記錄用於示例代碼。
 
type
  TMyRecord = record
    I: Integer;
    S: string;
  end;
//按TMYRECORD的I字段遞增順序排序的示例
//比較類,以降序對TMyRecord的I字段進行排序
 
type
  TMyRecordComparer1 = class(TComparer<TMyRecord>)
  public
    function Compare(const Left, Right: TMyRecord): Integer; override;
  end;
 
function TMyRecordComparer1.Compare(const Left, Right: TMyRecord): Integer;
begin
  Result := (Right.I - Left.I);
end;
//樣例程序
 
var
  Values: array[0..3] of TMyRecord = (
    (I: 1; S: 'Carol'),
    (I: 3; S: 'Bob'),
    (I: 4; S: 'Alice'),
    (I: 2; S: 'Dave')
  );
  R: TMyRecord;
 
begin
  TArray.Sort<TMyRecord>(Values, TMyRecordComparer1.Create);
  for R in Values do
    WriteLn(Format('%d:%s', [R.I, R.S]));
end.
//執行結果
 
//4:Alice
//3:Bob
//2:Dave
//1:Carol
//TMYRECORD的S字段的升序排序示例
//比較類,該類按升序對TMyRecord的S字段進行排序
 
type
  TMyRecordComparer2 = class(TComparer<TMyRecord>)
  public
    function Compare(const Left, Right: TMyRecord): Integer; override;
  end;
 
function TMyRecordComparer2.Compare(const Left, Right: TMyRecord): Integer;
begin
  Result := System.SysUtils.CompareStr(Left.S, Right.S);
end;
//樣例程序
 
var
  Values: array[0..3] of TMyRecord = (
    (I: 1; S: 'Carol'),
    (I: 3; S: 'Bob'),
    (I: 4; S: 'Alice'),
    (I: 2; S: 'Dave')
  );
  R: TMyRecord;
 
begin
  TArray.Sort<TMyRecord>(Values, TMyRecordComparer2.Create);
  for R in Values do
    WriteLn(Format('%d:%s', [R.I, R.S]));
end.
//執行結果
 
//4:Alice
//3:Bob
//1:Carol
//2:Dave
//通過委托給回調例程對比較進行排序
//System.Generics.Defaults.TDelegatedComparer類將比較過程委托給回調例程。
 
//TMYRECORD的S字段的升序排序示例
var
  Values: array[0..3] of TMyRecord = (
    (I: 1; S: 'Carol'),
    (I: 3; S: 'Bob'),
    (I: 4; S: 'Alice'),
    (I: 2; S: 'Dave')
  );
  R: TMyRecord;
 
begin
  TArray.Sort<TMyRecord>(Values, TDelegatedComparer<TMyRecord>.Construct(
    function(const Left, Right: TMyRecord): Integer
    begin
      Result := System.SysUtils.CompareStr(Left.S, Right.S);
    end
  ));
  for R in Values do
    WriteLn(Format('%d:%s', [R.I, R.S]));
end.
//執行結果

 
//4:Alice
//3:Bob
//1:Carol
//2:Dave

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM