【发布时间】:2015-01-30 14:06:48
【问题描述】:
我在 Delphi 2005 中使用 IndexOf() 来提取 TStrinList 的索引。目前它只搜索一个字符串,但我希望它搜索替代字符串。例如,搜索 'String A'、'String B' 或 'String C' 并给出最先找到的索引。
是否可以使用 IndexOf() 来做到这一点,还是有其他方法?
【问题讨论】:
标签: delphi indexof tstringlist
我在 Delphi 2005 中使用 IndexOf() 来提取 TStrinList 的索引。目前它只搜索一个字符串,但我希望它搜索替代字符串。例如,搜索 'String A'、'String B' 或 'String C' 并给出最先找到的索引。
是否可以使用 IndexOf() 来做到这一点,还是有其他方法?
【问题讨论】:
标签: delphi indexof tstringlist
没有内置功能可以做到这一点。
您可以多次调用IndexOf。然后取不等于-1 的最小索引。这快速且易于实施,但不会具有最佳性能。
如果性能很关键,另一种选择是滚动您自己的函数来执行搜索。对无序列表进行足够简单的线性搜索。如果您想在有序列表上使用二进制搜索,则稍微复杂一些。
【讨论】:
没有内置方法可以做到这一点,也没有办法使用对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 和最短值的长度之间),则可能值得添加一个额外的测试以跳出循环),因为不可能有一个。
【讨论】: