Можно ли использовать IndexOf для поиска двух или более альтернативных строк в TStringList в Delphi?
Я использовал IndexOf() для извлечения индекса TStrinList в Delphi 2005. На данный момент он ищет только одну строку, но я бы хотел, чтобы он искал альтернативные строки. Например, чтобы найти "String A", "String B" или "String C" и дать мне индекс того, что будет найдено первым.
Возможно ли это сделать с помощью IndexOf() или есть другой метод?
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 до длины кратчайшего значения), так как не может быть одного.
Там нет встроенной функциональности, которая делает это.
Вы можете использовать несколько звонков для IndexOf
, Затем возьмите наименьший индекс, который не равен -1
, Это быстро и легко реализовать, но не будет иметь оптимальной производительности.
Другим вариантом, если производительность критична, было бы переключение вашей собственной функции для выполнения поиска. Достаточно простой линейный поиск неупорядоченных списков. Немного сложнее, если вы хотите использовать бинарный поиск в упорядоченном списке.