Можно ли использовать 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, Это быстро и легко реализовать, но не будет иметь оптимальной производительности.

Другим вариантом, если производительность критична, было бы переключение вашей собственной функции для выполнения поиска. Достаточно простой линейный поиск неупорядоченных списков. Немного сложнее, если вы хотите использовать бинарный поиск в упорядоченном списке.

Другие вопросы по тегам