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