2015-01-30 2 views
1

Delphi 2005에서 TStrinList의 인덱스를 추출하기 위해 IndexOf()를 사용했습니다. 현재는 한 문자열 만 검색하지만 다른 문자열을 검색하고 싶습니다. 예를 들어 '문자열 A', '문자열 B'또는 '문자열 C'를 검색하고 먼저 찾은 색인을 제공하십시오.Delphi의 TStringList에서 두 개 이상의 대체 문자열을 검색하는 데 IndexO를 사용할 수 있습니까?

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과 가장 짧은 값의 길이 사이)를 찾았 으면 루프에서 빠져 나올 수 있습니다.

+0

가장 작은 값이 -1이 아니면 안됩니다. –

+0

@David : 이미 알아 챘습니다. –

+0

* 물론 String의 첫 번째 항목을 찾고 다음 문자가 [A..C] 중 하나인지 테스트 할 수 있습니다. * 그럴 수는 없습니다. 첫 번째 문자는 String D이지만 대상 중 하나는 나중에 나타날 수 있습니다. –

2

이렇게하는 기능이 없습니다.

IndexOf을 여러 번 사용할 수 있습니다. 그런 다음 -1과 같지 않은 가장 작은 색인을 가져옵니다. 구현이 쉽고 빠르지 만 최적의 성능을 내지는 못합니다.

성능이 중요한 경우 또 다른 옵션은 검색을 수행하기 위해 자신의 기능을 롤백하는 것입니다. 정렬되지 않은 목록을 간단하게 선형 검색합니다. 순서가 지정된 목록에서 이진 검색을 사용하려면 좀 더 복잡합니다.