如何使用注释对stringlist进行排序

时间:2015-08-11 23:36:55

标签: delphi delphi-xe8

我有带有注释的字符串列表(如Ini文件部分内容):

;comment c
c=str1
;comment b
b=str2
;comment a
a=str3

如何按名称对此列表进行排序的任何想法:

;comment a
a=str3
;comment b
b=str2
;comment c
c=str1

配对评论应在排序期间与配对链接

2 个答案:

答案 0 :(得分:7)

一个选项是将TStringList内容解析为第二个列表,将名称,值和注释字符串分开并分组在一起,然后根据需要对名称进行排序,然后重新填充{{1与已排序的组。例如:

TStringList

答案 1 :(得分:1)

这是一个简单的程序,可以将空间作为货物进行分类和处理。我还添加了代码来处理文件末尾的注释。

这适用于没有仿制品或高级类型的旧版Delphi,如Remy的答案(为使用旧版本的人提供方便)

function SortKeys(List: TStringList; Index1, Index2: Integer): Integer;
begin
  result := CompareText(List.Names[Index1], List.Names[Index2]);
end;


Procedure SortStringListWithComments(AStrings: TStrings);
var
 LCargoText: TStringList;
 LSortedText : TStringList;
 s: string;
 i : integer;
begin
  LCargoText := nil; 
  LSortedText := TStringList.Create;
  try
    for i := 0 to AStrings.count-1 do
    begin
      s := Trim(AStrings[i]);
      if (s='') or (s[1] = ';') then //LCargoText and blank lines attached to sorted strings (Boolean short circuit assumed here) 
       begin
        if LCargoText = nil then
          LCargoText := TStringList.Create;
        LCargoText.Add(AStrings[i]);
      end
      else
      begin
        LSortedText.AddObject(AStrings[i], LCargoText);
        LCargoText := nil; //set nil to deal with cases where we have no   comments for a following key value pair
      end;

    end;

    LSortedText.CustomSort(SortKeys);

    // LSortedText.sort -  will cause a1=x to be sorted before a=x

    AStrings.clear;

    for i := 0 to LSortedText.count-1 do
    begin
      if  LSortedText.objects[i] <> nil then
      begin
        AStrings.AddStrings(TStringList(LSortedText.Objects[i]));
        LSortedText.Objects[i].Free;
      end;
      AStrings.Add(LSortedText[i]);
    end;

    if LCargoText <> nil then
    begin
      AStrings.AddStrings(LCargoText) ; //comments orphaned at the end of the file
      LCargoText.Free;
    end;
  finally
    LSortedText.Free;
  end; 
end;