データを並べ替えることができる場合 ( Turbo powers SysToolsには、適切に機能する優れた並べ替えルーチンがあります)、2 つの入力リストと出力リストを使用してコードでこれをかなり迅速に行うことができます。この背後にある概念は単純です。
- 同じ方法でソートされた 2 つのリストを取得します。
- 左側が右側よりも小さい場合、右側にその値がないため、「欠落リスト」に追加し、左側のカーソルを増やします。
- それらが等しい場合は、両方をインクリメントします。
- 右側が左側よりも小さい場合は、右側のみをインクリメントします (オプションで「削除する必要がある」リストに追加します)。
このプロセスは「オールド マスター/ニュー マスター」プロセスと呼ばれることもあり、両方のリストを 1 回だけ参照するだけなので非常に高速です。
簡単な例:
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;
次のコードは、テストに使用したものです。これは単なる例ですが、実際の状況では、キーが適切にソートされ、数字が正しくパディングされ、必要に応じて大文字と小文字が区別されるようにキーを作成します。ターボ パワー ソート ルーチンを使用する場合、2 つのリストの代わりに 2 つのソートを使用できますが、最終的な結果は同じです。
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 でテストされ、適切に動作します。