如果您可以对数据进行排序(Turbo powers SysTools有一个运行良好的排序例程),那么您可以使用两个输入列表和一个输出列表在代码中相当快地完成此操作。这背后的概念很简单:
- 取两个列表,以相同的方式排序
- 如果左侧小于右侧,则右侧缺少该值,因此将其添加到“缺失列表”并增加左侧的光标。
- 如果它们相等,则增加两者,
- 如果右侧小于左侧,则仅增加右侧(可选添加到“必须删除”列表)。
这个过程有时被称为“老主人/新主人”过程,而且速度非常快,因为您只需走一遍这两个列表。
简单的例子:
var
ListL : tStringList; // the left list
ListR : tSTringList; // the right list
ListA : tSTringList; // the Add List (should start empty)
ListD : tStringList; // the Delete list (should start empty)
iCurL : integer; // Left Cursor
iCurR : integer; // Right Cursor
iRes : integer; // result of compare
begin
iCurL := 0;
iCurR := 0;
ListL := tStringList.create;
ListR := tSTringList.create;
ListA := tSTringList.create;
ListD := tStringList.create;
InitAndLoadLists(ListL,ListR,ListA,ListD);
while (iCurL <= ListL.Count-1) and (iCurR <= ListR.Count-1) do
begin
iRes := CompareStr(ListL.Strings[iCurL],ListR.Strings[iCurR]);
if iRes = 0 then
begin
inc(iCurL);
inc(iCurR);
end;
if iRes < 0 then
begin
ListA.Add(ListL.Strings[iCurL]);
inc(iCurL);
end;
if iRes > 0 then
begin
listD.Add(ListR.Strings[iCurR]);
inc(iCurR);
end;
end;
while (iCurL <= ListL.Count-1) do
begin
listA.Add(ListL.Strings[iCurL]);
inc(iCurL);
end;
while (iCurR <= ListR.Count-1) do
begin
listD.Add(ListR.Strings[iCurR]);
inc(iCurR);
end;
ShowMessage( 'ADDS' + ^M+^J + ListA.Text);
ShowMessage( 'DELS' + ^M+^J + ListD.Text);
end;
以下代码是我用于测试的代码。这只是一个例子,但在现实世界的情况下,我会构建我的密钥,以便它们能够正确排序、正确的填充数字,并在适当的情况下强制大小写。如果您使用 turbo power 排序例程,您可以使用两个排序而不是两个列表,但最终效果是相同的。
procedure InitAndLoadLists(ListL, ListR, ListA, ListD: TStringList);
begin
ListL.Add('A,1');
ListL.Add('B,3');
ListL.Add('C,2');
ListR.Add('A,2');
ListR.Add('B,3');
ListR.Add('C,4');
end;
编辑:代码在 Delphi 2009 中测试并且表现正常。