【问题标题】:Compare to Stringlist与字符串列表比较
【发布时间】:2013-07-27 07:29:58
【问题描述】:

我必须比较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 .... 
....

【问题讨论】:

  • 这取决于...请定义“差异”。想想a;ba;a。在这种情况下,您希望得到什么结果?

标签: delphi comparison tstringlist


【解决方案1】:

不要使用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;

【讨论】:

    【解决方案2】:

    最佳性能:
    对输入字符串列表进行排序
    与类似于merge sorted lists的算法进行比较(您会发现每个列表中缺少的内容)

    更简单但更慢:
    将字符串列表复制到结果字符串列表
    第一个字符串列表的一个循环(对此 for Count-1 downto 0 do 使用反向循环)
    第二次搜索相同的字符串(如果找到) - 从两个列表中删除
    差异将保留在字符串列表中

    【讨论】:

      【解决方案3】:

      您必须小心 CompareStringLists 的实现。默认情况下,TStringList 的 Sort 例程将不区分大小写,但使用的比较是区分大小写的,如果您的列表中有任何混合大小写,您将得到假定的未匹配项的井喷。

      需要将排序设置为区分大小写

      List1.CaseSensative := true ;
      List1.Sort ;
      List2.CaseSensative := true ;
      List2.Sort ;
      

      使比较不区分大小写

      如果 UpperCase(List1[I])

      else if UpperCase(List1[I]) > UpperCase(List2[J]) then
      

      分别。

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 2016-04-22
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 2021-08-05
        相关资源
        最近更新 更多