我有带有注释的字符串列表(如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
配对评论应在排序期间与配对链接
答案 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;