我目前正在尝试比较两个TStringList
以及一个是否包含另一个。
作为一个例子。
sl1 := TStringList.Create;
for i := 0 to record.count - 1 do
sl.add(record[i]);
它在程序启动时执行,直到程序再次启动才更新。请注意,record
是一个字符串,可以是多个单词。 (例如杰克,托马斯·伦伯,莱斯特等等)
然后我有一个像这样的计时器。
sl2 := TStringList.Create;
for i := 0 to record.count - 1 do
sl2.add(record[i]);
if sl1 item is not in sl2 then <-- stuck here
s := s + record[i];
我想比较两个列表,然后创建一个缺少的字符串。这应该很容易,但是字符串的位置可以改变。 sl1[2]
中的内容现在可以位于sl2[7]
中。在s
字符串中,我只想添加丢失且未更改位置的项目。
答案 0 :(得分:0)
您需要将sl1的每个项目与sl2的每个项目进行比较。
for i := 0 to sl1.count - 1 do
begin
found := false;
for j := 0 to sl2.count - 1 do
begin
if sl1[i] = sl2[j] then
begin
found := true;
break;
end;
end;
if not Found then
slMissing.add(sl1[i])
end;
如果需要,可以使用TStringList.IndexOf
代替内部循环。
答案 1 :(得分:0)
这很简单:
if sl1 item is not in sl2 then
<-卡在这里
您可以像这样使用sl2.IndexOf():
if sl2.IndexOf(sl1[i]) < 0 then
但是,如果两个列表都已排序并保持排序,那么您可能会跳过一些项目,因为一个列表中的索引永远不会低于另一个列表中的索引。
答案 2 :(得分:0)
只需遍历两个字符串列表,然后将每个字符串列表进行比较,直到找到匹配项
sl1.Add('one');
sl1.Add('two');
sl2.Add('two');
sl2.Add('one');
i := 0;
j := 0;
found := FALSE;
while (i < sl1.Count) and not found do
begin
j := 0;
while (j < sl2.Count) and not found do
begin
found := sl1[i] = sl2[j];
inc(j);
end;
inc(i);
end;
if found then
ShowMessage('found: item ' + IntToStr(i) + ' was on ' + IntToStr(j) + ' in the second list')
else
ShowMessage('Not found');
替代解决方案
i := 0;
found := FALSE;
while (i < sl1.Count) and not found do
begin
j := sl2.IndexOf(sl1[i]);
Found := j >= 0;
inc(i);
end;