如何根据特定规则对TStringList进行排序?

时间:2014-01-15 15:55:17

标签: delphi sorting tstringlist

我有一个TStringList,它有很多字符串。

我现在要做的是根据TStringList中的哪一列对某些值进行排序TStringList

例如。

adsfoiadjfoaidjfoaidfjo BABABA asdfsd 0101010
skfjlgjljkglsdkgjasaasd BABABA dafdff 0419299
asdaksdjakbkj3409560295 BABABA kjfhan 0923858
dsdddsdasdadasdasdasdgg BABABA dafdff 0419299
45645654654654654654666 BABABA dafdff 0489421
dsdddsdasdadasdasdasdgg CACACA dafdff 0419299

正如您所看到的那样,第二行和第四行具有相同的值BABABA以及行尾的相同数字,第五行具有相同的BABABA但不是相同的数字。第六行具有相同的数字,但不是相同的BABABA。

我想要对它们进行排序的正确方法是

adsfoiadjfoaidjfoaidfjo BABABA asdfsd 0101010
skfjlgjljkglsdkgjasaasd BABABA dafdff 0419299
dsdddsdasdadasdasdasdgg BABABA dafdff 0419299
45645654654654654654666 BABABA dafdff 0489421
asdaksdjakbkj3409560295 BABABA kjfhan 0923858
dsdddsdasdadasdasdasdgg CACACA dafdff 0419299

我想要的是在BABABA之后排序(第25-30栏),以及数字,数字是否匹配。如果数字不匹配,它应该在BABABA之后排序,如果没有排序,它可以以任何方式排序。

2 个答案:

答案 0 :(得分:5)

因此,您首先要对第二列进行排序,然后对第四列进行排序。然后你需要TStringList.CustomSort

有关TStringListSortCompare功能类型的帮助:

  

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

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

因此,如果您首先在第二列进行比较,并且当相等时,继续比较第四列。假设所有文本都是大写的,所有字符串的大小相同且语法相同,那么这应该有效:

function CompareItems(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := CompareStr(Copy(List[Index1], 25, 6), Copy(List[Index2], 25, 6));
  if Result = 0 then
    Result := CompareStr(Copy(List[Index1], 39, 7), Copy(List[Index2], 39, 7));
end;

用法:

List.CustomSort(CompareItems);

答案 1 :(得分:1)

定义您自己的比较函数,该函数选择您希望用于订购的字符串部分:

function MyCompare(List: TStringList; Index1, Index2: Integer): Integer;

  function GetOrderingSubString(const s: string): string;
  begin
    Assert(Length(s)=45);
    Result := Copy(s, 25, 6) + Copy(s, 39, 7);
  end;

var
  s1, s2: string;

begin
  s1 := GetOrderingSubString(List[Index1]);
  s2 := GetOrderingSubString(List[Index2]);
  Result := CompareText(s1, s2); // or CompareStr, you decide
end;

并将该功能传递给CustomSort

List.CustomSort(MyCompare);