我必须比较2个stringlist,我想知道第二个stringlist中搜索第一个stringlist是否是执行此问题的唯一或推荐版本
我的代码会像这样
var
aFirstStrList: TStringList ;
aSecondStringList: TStringList;
MissingElement_firstElement_not_inside_second: TStringList;
MissingElement_SecondElement_not_inside_First: TStringList;
...
for i := 0 to aFirstStrList.Count - 1 do
begin
if aSecondStringList.IndexOf(aFirstStrList[i] < 0 ) then
begin
// react on not found elements
....
MissingElement_firstElement_not_inside_second.add(...);
end;
end;
// and now same code just opposite search direction ....
....
答案 0 :(得分:11)
不使用IndexOf
,而是先对两个列表进行排序,以防止在每个周期搜索整个列表。此外,可以在一个循环中实现这一点。
假设您希望将结果分成两个单独的字符串列表,请尝试以下操作:
procedure CompareStringLists(List1, List2: TStringList;
Missing1, Missing2: TStrings);
var
I: Integer;
J: Integer;
begin
List1.Sort;
List2.Sort;
I := 0;
J := 0;
while (I < List1.Count) and (J < List2.Count) do
begin
if List1[I] < List2[J] then
begin
Missing2.Add(List1[I]);
Inc(I);
end
else if List1[I] > List2[J] then
begin
Missing1.Add(List2[J]);
Inc(J);
end
else
begin
Inc(I);
Inc(J);
end;
end;
for I := I to List1.Count - 1 do
Missing2.Add(List1[I]);
for J := J to List2.Count - 1 do
Missing1.Add(List2[J]);
end;
用法:
procedure TForm1.Button1Click(Sender: TObject);
var
List1: TStringList;
List2: TStringList;
begin
List1 := TStringList.Create;
List2 := TStringList.Create;
try
List1.CommaText := 'A, C, F, G, H, K, L, M, N, O, Q, R';
List2.CommaText := 'C, D, E, F, J, P, Q, S, T, U, V, W';
Memo1.Lines.Assign(List1);
Memo2.Lines.Assign(List2);
CompareStringLists(List1, List2, Memo3.Lines, Memo4.Lines);
finally
List2.Free;
List1.Free;
end;
end;
答案 1 :(得分:0)
最佳表现:
排序输入字符串列表
与类似于merge sorted lists的算法进行比较(在那里你会发现每个列表中缺少的内容)
更简单但更慢:
将字符串列表复制到结果字符串列表中
第一个字符串列表的一个循环(对此for Count-1 downto 0 do
使用反向循环)
如果找到则在第二个中搜索相同的字符串 - 从两个列表中删除
差异将保留在字符串列表中
答案 2 :(得分:0)
您必须小心CompareStringLists的实现。默认情况下,TStringList的Sort例程将对不区分大小写进行排序,但使用的比较是区分大小写的,如果你的列表中有任何混合大小写,你将会得到所谓的未命中匹配的井喷。
需要通过
将排序设置为区分大小写List1.CaseSensative := true ;
List1.Sort ;
List2.CaseSensative := true ;
List2.Sort ;
OR
使比较不区分大小写
如果UpperCase(List1 [I])&lt; UpperCase(List2 [J])然后
和
else if UpperCase(List1[I]) > UpperCase(List2[J]) then
分别