1. TArray 클래스는 ?
Generics.Collections 유닛의 맨 위에 TArray 클래스가 있다.
주의) TArray<T>형이 아니다 -_-;
TArray<T>는 System 유닛에 array of T라고 선언되어 있다.
TArray 클래스는 class function으로만 이루어져 있다.
Sort 함수와 BinarySearch 함수이다.
2. 초기화
함수의 테스트를 위해 배열을 선언하고 초기화해보자.
3. Sort
인자들의 비교를 위한 TComparer를 선언한다.
인자가 string이니 선언도 string으로 한다.
1) 함수를 이용한 방법
TComparer의 Construct 클래스 메소드를 이용해서 IComparer인터페이스를 생성해서 넘겨준다.
어차피 인터페이스를 넘기는 것이므로 메모리 해제는 신경쓸 필요가 없다.
2) Anonymous Method를 이용한 방법
동일한 방법이나 Delphi 2009에서부터 추가된 Anonymous Method를 이용해서 정렬하는 방법이다.
자세한 설명은 Dr.Bob에서 보면 되겠다.
http://www.drbob42.com/examines/examinA5.htm
4. BinarySearch
Sort와 동일하다.
FoundIndex 인자에 찾은 Index를 알려준다.
5. 결론
괜히 코드로 처리하느라 힘빼지 말고 배열의 정렬과 검색, 이제는 간단하게 처리하자.
대신 원리 파악을 위해 반드시 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';
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>;
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;
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;
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;
var
FoundIndex: Integer;
begin
TArray.BinarySearch<string>( FMyArray, 'ccc', FoundIndex, TMyStringComparer.Construct(MyStringComparison) );
ShowMessage( IntToStr(FoundIndex) );
end;
5. 결론
괜히 코드로 처리하느라 힘빼지 말고 배열의 정렬과 검색, 이제는 간단하게 처리하자.
대신 원리 파악을 위해 반드시 TArray 클래스의 소스를 보고 동작 원리는 파악하도록 한다.
'Programming > Delphi' 카테고리의 다른 글
[Delphi] Secondary 모니터에서 Border가 bsNone인 폼 최대화시 문제 (4) | 2011.01.01 |
---|---|
Delphi - TOpenDialog쓰면서 FileExists로 왜 체크해요? (0) | 2010.03.14 |
Delphi - class의 private, protected에 strict를 추가해보자. (4) | 2010.01.29 |
Delphi - 클래스 내에 const 사용하기 (0) | 2010.01.27 |
Delphi - Generic중 유용한 TObjectList<T>에 ToArray를 추가해보자 (6) | 2010.01.21 |