1

我有一个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 之后排序,如果没有排序,它可以以任何方式排序。

4

2 回答 2

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);
于 2014-01-15T17:34:43.127 回答
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);
于 2014-01-15T17:23:14.490 回答