Joe*_*Joe 1 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之后排序,如果没有排序,它可以以任何方式排序.
因此,您首先要对第二列进行排序,然后对第四列进行排序.那你需要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;
Run Code Online (Sandbox Code Playgroud)
用法:
List.CustomSort(CompareItems);
Run Code Online (Sandbox Code Playgroud)