【问题标题】:How do I sort a TStringList according to specific rules?如何根据特定规则对 TStringList 进行排序?
【发布时间】:2014-01-15 15:55:16
【问题描述】:

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

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

例如。

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

如您所见,第 2 行和第 4 行具有相同的值 BABABA,并且行尾的数字也相同,第 5 行具有相同的 BABABA 但数字不同。第六行的数字相同,但不是相同的 BABABA。

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

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

我想要的首先是在 BABABA(第 25-30 列)之后排序,如果数字匹配,数字也是如此。如果数字不匹配,则应在 BABABA 之后排序,如果不排序,则可以以任何方式排序。

【问题讨论】:

    标签: delphi sorting tstringlist


    【解决方案1】:

    因此,您首先要对第二列进行排序,然后再对第四列进行排序。那你需要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);
    

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    定义您自己的比较函数,挑选出您希望用于排序的字符串部分:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2014-03-12
      • 1970-01-01
      相关资源
      最近更新 更多