如何比较两个TStringList?

时间:2019-02-27 06:22:25

标签: delphi

我目前正在尝试比较两个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字符串中,我只想添加丢失且未更改位置的项目。

3 个答案:

答案 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;