Если вы можете отсортировать данные ( 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;
Следующий код - это то, что я использовал для тестирования. Это всего лишь пример, но в реальной ситуации я построил бы свои ключи так, чтобы они правильно сортировали, добавляли правильные числа и вводили регистр в случае необходимости. Если вы используете процедуры сортировки турбо-мощности, вы можете использовать ДВА сортировки вместо двух списков, но конечный эффект тот же.
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 и работает правильно.