默認排序比較類
您可以使用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