2017-12-30 54 views
2

文字列の配列を長さでソートしたい(長めの文字列が先になります)、長さが同じであればアルファベット順にソートします。これは、これまでに得ているものです。長さで文字列配列をソートする方法は?

uses 
    System.Generics.Defaults 
    , System.Types 
    , System.Generics.Collections 
    ; 

procedure TForm2.FormCreate(Sender: TObject); 
var 
    _SortMe: TStringDynArray; 
begin 
    _SortMe := TStringDynArray.Create('abc', 'zwq', 'Long', 'longer'); 

    TArray.Sort<string>(_SortMe, TDelegatedComparer<string>.Construct(
    function(const Left, Right: string): Integer 
    begin 
     Result := CompareText(Left, Right); 
    end)); 
end; 

期待される結果:長い、長いが、ABC、あなたの無名関数を調整

+1

? –

答えて

4

をzwq:

function(const Left, Right: string): Integer 
    begin 
     //Compare by Length, reversed as longest shall come first 
     Result := CompareValue(Right.Length, Left.Length); 
     if Result = EqualsValue then 
     Result := CompareText(Left, Right); 
    end)); 

あなたはSystem.Mathのを追加する必要がありますおよびSystem.SysUtilsを使用します。

1

私は、このためにTStringList ...

任意の方法を使用しているだろう、ちょうど比較機能をカスタマイズ:

コード内であなたは長さを比較します
TArray.Sort<string>(_SortMe, TDelegatedComparer<string>.Construct(
    function(const Left, Right: string): Integer 
    begin 
     Result := length(Right) - length(Left); // compare by decreasing length 
     if Result = 0 then 
     Result := CompareText(Left, Right); // compare alphabetically 
    end)); 
関連する問題