Delphi中的非字母排序

时间:2011-08-19 14:49:54

标签: delphi sorting

我正在尝试按特定顺序对TStringList进行排序。

而不是A,B,C ..我试图在B,C,A中订购它。

我已经用我需要的顺序声明了一个const数组。

我尝试使用CustomSorte,但我无法理解如何编写该函数。

我正在尝试使用for循环,但它真的很难和令人困惑!

我不是德尔福专家...

提前谢谢你们!

1 个答案:

答案 0 :(得分:11)

关于TStringListSortCompare功能类型的帮助:

  

Index1和Index2是要比较的List中项目的索引。   回调返回:

     
      
  • 如果Index1标识的字符串位于Index2
  • 标识的字符串之前,则小于0的值   如果两个字符串相同,则
  • 0
  •   
  • 如果带有Index1的字符串位于由Index2标识的字符串之后,则大于0的值。
  •   

因此,如果您从第一项的自定义顺序中减去第二项的自定义顺序,那么这些项目将按您的需要进行排序。

const
  Order: array[0..6] of String = ('B', 'C', 'A', 'D', 'G', 'F', 'E');

function GetStringOrder(const S: String; CaseSensitive: Boolean): Integer;
begin
  for Result := 0 to Length(Order) - 1 do
    if (CaseSensitive and (CompareStr(Order[Result], S) = 0)) or
        (not CaseSensitive and (CompareText(Order[Result], S) = 0)) then
      Exit;
  Result := Length(Order);
end;

function MyCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := GetStringOrder(List[Index1], List.CaseSensitive) -
    GetStringOrder(List[Index2], List.CaseSensitive);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    List.CommaText := 'A,G,a,C,B,b,F,a,B,C,c,D,d,E,D,F,G,C,A,G,d,e,f,g';
    List.CaseSensitive := True;
    List.CustomSort(MyCompareStrings);
    ListBox1.Items.Assign(List);
  finally
    List.Free;
  end;
end;