【问题标题】:Can IndexOf be used to search for two or more alternate strings in a TStringList in Delphi?可以使用IndexOf在Delphi的TStringList中搜索两个或多个备用字符串吗?
【发布时间】:2015-01-30 14:06:48
【问题描述】:

我在 Delphi 2005 中使用 IndexOf() 来提取 TStrinList 的索引。目前它只搜索一个字符串,但我希望它搜索替代字符串。例如,搜索 'String A'、'String B' 或 'String C' 并给出最先找到的索引。

是否可以使用 IndexOf() 来做到这一点,还是有其他方法?

【问题讨论】:

    标签: delphi indexof tstringlist


    【解决方案1】:

    没有内置功能可以做到这一点。

    您可以多次调用IndexOf。然后取不等于-1 的最小索引。这快速且易于实施,但不会具有最佳性能。

    如果性能很关键,另一种选择是滚动您自己的函数来执行搜索。对无序列表进行足够简单的线性搜索。如果您想在有序列表上使用二进制搜索,则稍微复杂一些。

    【讨论】:

      【解决方案2】:

      没有内置方法可以做到这一点,也没有办法使用对IndexOf 的单个调用来实现它。

      如果您需要找到最先出现的那个,您需要对IndexOf 进行三个单独的调用,每个值一个,并返回具有最低索引的那个。一个简单的包装器是这样的(连同一个控制台应用程序来测试它):

      program Project2;
      
      {$APPTYPE CONSOLE}
      
      uses
        System.SysUtils, Classes;
      
      
      function GetLowestIndexOf(const SL: TStrings; const AValues: array of string): Integer;
      var
        Idx, Temp: Integer;
      begin
        // Initialize with first test results (which may be -1)
        Result := SL.IndexOf(AValues[0]);
        for Idx := 1 to High(AValues) do
        begin
          Temp := SL.IndexOf(AValues[Idx]);
          if (Temp > -1) and ((Temp < Result) or (Result = -1)) then
            Result := Temp;
        end;
      end;
      
      var
        Test: Integer;
        SL: TStringList;
      
      begin
        SL := TStringList.Create;
        SL.Text := 'Some Value'#13'String C'#13'Another Value'#13'Something Else'#13 +
                   'String A'#13'Yet Another'#13'String B';
        Test := GetLowestIndexOf(SL, ['String A', 'String B', 'String C']);
        WriteLn(SL[Test]);
        ReadLn;
      end.
      

      如果您要检查的项目列表很长,如果您已经找到了可能的最低索引(介于 1 和最短值的长度之间),则可能值得添加一个额外的测试以跳出循环),因为不可能有一个。

      【讨论】:

      • 你需要最小的不等于-1
      • 当然,你可以简单地查找第一次出现的String,然后测试下一个字母是否是[A..C] 那不会'不行。第一个可能是字符串 D,但其中一个目标可能稍后出现。
      猜你喜欢
      • 2015-11-24
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多