我有两个我希望同步的字符串列表,以便相等的行获得相同的索引,而不同的行将保留在它们最初的列表中,而另一个字符串列表应该得到一个"填充符#34 ;对于那个指数。考虑这个例子:
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
我该怎么做呢?
答案 0 :(得分:3)
在列表单调增加的情况下尝试此操作。
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;
答案 1 :(得分:3)
我实际上设法制作了一个适合我需要的方法:
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;
它需要对列表进行排序,但不要将sorted属性设置为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
答案 2 :(得分:-1)
我希望某种this(Levenshtein距离)算法可以帮助你。