Wenn Sie die Daten sortieren können ( Turbo versorgt SysTools hat eine gute Sortierroutine, die gut funktioniert), dann können Sie dies in Code ziemlich schnell mit zwei Eingabelisten und einer Ausgabeliste tun. Das Konzept dahinter ist einfach:
- Man nehme zwei Listen, die auf die gleiche Weise sortiert sind
- Wenn die linke Seite kleiner als die rechte Seite ist, dann fehlt der rechten Seite dieser Wert, also fügen Sie ihn zu Ihrer "Fehlenden Liste" hinzu und erhöhen Sie den Cursor für die linke Seite.
- Wenn sie gleich sind, dann werden beide erhöht,
- Wenn die rechte Seite kleiner als die linke Seite ist, dann wird nur die rechte Seite erhöht (optional zur Liste "muss gelöscht werden" hinzufügen).
Dieser Prozess wird manchmal auch als "Old Master/New Master"-Prozess bezeichnet und ist extrem schnell, da Sie beide Listen nur einmal durchlaufen.
Einfaches Beispiel:
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;
Der folgende Code wurde von mir zum Testen verwendet. Dies ist nur ein Beispiel, aber in einer realen Situation würde ich meine Schlüssel so aufbauen, dass sie richtig sortieren, Zahlen richtig auffüllen und gegebenenfalls Groß- und Kleinschreibung erzwingen. Wenn Sie die Turbo-Power-Sortierroutinen verwenden, können Sie ZWEI Sortierungen anstelle von zwei Listen verwenden, aber der Endeffekt ist derselbe.
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;
Edit : Der Code wurde in Delphi 2009 getestet und verhält sich korrekt.