1. TArray 클래스는 ?

Generics.Collections 유닛의 맨 위에 TArray 클래스가 있다.

주의) TArray<T>형이 아니다 -_-;
TArray<T>는 System 유닛에 array of T라고 선언되어 있다.

TArray 클래스는 class function으로만 이루어져 있다.
Sort 함수와 BinarySearch 함수이다.


2. 초기화

함수의 테스트를 위해 배열을 선언하고 초기화해보자.

  private
    FMyArray: TArray<string>;

  SetLength( FMyArray, 5 );
  FMyArray[0] := 'ccc';
  FMyArray[1] := 'ddd';
  FMyArray[2] := 'aaa';
  FMyArray[3] := 'eee';
  FMyArray[4] := 'fff';


3. Sort

인자들의 비교를 위한 TComparer를 선언한다.
인자가 string이니 선언도 string으로 한다.

type
  TMyStringComparer = TComparer<string>;


1) 함수를 이용한 방법

TComparer의 Construct 클래스 메소드를 이용해서 IComparer인터페이스를 생성해서 넘겨준다.
어차피 인터페이스를 넘기는 것이므로 메모리 해제는 신경쓸 필요가 없다.

function MyStringComparison(const Left, Right: string): Integer;
begin
  Result := CompareStr(Left, Right);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  TArray.Sort<string>( FMyArray, TMyStringComparer.Construct(MyStringComparison) );
end;


2) Anonymous Method를 이용한 방법

동일한 방법이나 Delphi 2009에서부터 추가된 Anonymous Method를 이용해서 정렬하는 방법이다.

자세한 설명은 Dr.Bob에서 보면 되겠다.

http://www.drbob42.com/examines/examinA5.htm

procedure TForm2.Button2Click(Sender: TObject);
begin
  TArray.Sort<string>( FMyArray, TMyStringComparer.Construct(
    function (const Left, Right: string): integer
    begin
      Result := CompareStr(Left, Right);
    end
  ) );
end;


4. BinarySearch

Sort와 동일하다.
FoundIndex 인자에 찾은 Index를 알려준다.

procedure TForm2.Button3Click(Sender: TObject);
var
  FoundIndex: Integer;
begin
  TArray.BinarySearch<string>( FMyArray, 'ccc', FoundIndex, TMyStringComparer.Construct(MyStringComparison) );

  ShowMessage( IntToStr(FoundIndex) );
end;


5. 결론

괜히 코드로 처리하느라 힘빼지 말고 배열의 정렬과 검색, 이제는 간단하게 처리하자.
대신 원리 파악을 위해 반드시 TArray 클래스의 소스를 보고 동작 원리는 파악하도록 한다.

+ Recent posts