Как синхронизировать одинаковые строки в двух списках строк - PullRequest
2 голосов
/ 29 сентября 2011

У меня есть два списка строк, которые я хочу синхронизировать, чтобы одинаковые строки получали одинаковый индекс, тогда как разные строки будут сохраняться в списке, где они были изначально, а другой список строк должен получать «заполнитель» для этого индекса.Рассмотрим следующий пример:

SL1:  1,1,2,3,5,8 
SL2:  1,3,5,7,9

procedure SyncStringlists(aSL1,aSL2 : TStringList; aFill : string = '-');

Процедура должна изменить списки на

SL1:  1,1,2,3,5,8,-,-
SL2:  1,-,-,3,5,-,7,9

или, если списки отсортированы, на

SL1:  1,1,2,3,5,-,8,-
SL2:  1,-,-,3,5,7,',9

Какя должен идти делать это?

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

Попробуйте это для случая, когда ваши списки монотонно растут.

procedure SyncStringlists(SL1, SL2: TStringList; const Fill: string='-');
var
  i1, i2: Integer;
begin
  i1 := 0;
  i2 := 0;
  while (i1<SL1.Count) and (i2<SL2.Count) do begin
    if SL1[i1]<SL2[i2] then begin
      SL2.Insert(i2, Fill);
    end else if SL1[i1]>SL2[i2] then begin
      SL1.Insert(i1, Fill);
    end;
    inc(i1);
    inc(i2);
  end;
  while SL1.Count<SL2.Count do begin
    SL1.Add(Fill);
  end;
  while SL2.Count<SL1.Count do begin
    SL2.Add(Fill);
  end;
end;
3 голосов
/ 29 сентября 2011

Мне действительно удалось создать метод, который соответствует моим потребностям:

procedure SyncStringlists(aSL1,aSL2 : TStringList; aFill : string = '-');
var
  I,J : integer;
begin
  I := 0;
  J := 0;

  aSL1.Sort;
  aSL2.Sort;

  while (I<aSL1.Count) and (J<aSL2.Count) do
  begin
    if aSL1[I] > aSL2[J] then
      aSL1.Insert(I,aFill)
    else if aSL1[I] < aSL2[J] then
      aSL2.Insert(J,aFill);

    inc(I);
    inc(J);
  end;

  while aSL1.Count < aSL2.Count do aSL1.Add(aFill);
  while aSL2.Count < aSL1.Count do aSL2.Add(aFill);
end;

Требуется, чтобы списки были отсортированы, но НЕ имели свойства сортировки true (потому что тогда мы не можем вставить его в него).)

Пример выполнения:

SL1: 1,1,2,3,5,8,a,b,c,d,e,f
SL2: 1,3,5,7,9,e,f,g,h,i

синхронизировано:

SL1: 1,1,2,3,5,-,8,-,a,b,c,d,e,f,-,-,-
SL2: 1,-,-,3,5,7,-,9,-,-,-,-,e,f,g,h,i
0 голосов
/ 29 сентября 2011

Я надеюсь, что какой-то этот (алгоритм Левенштейна) поможет вам.

...