음..
다음과 같은 파일명 리스트가 있다고 합시다.
파일1
파일2
파일3
파일10
파일1-1
파일1-2
파일12
파일4
파일11
파일11-11
파일11-1
파일11-2
TStringList의 기본 Sort기능을 이용하거나
CompareString 를 이용해서 정렬하면 어떻게 정렬될가요?
바로 다음과 같이 나오게 됩니다.
파일1
파일10
파일11
파일1-1
파일11-1
파일11-11
파일11-2
파일12
파일1-2
파일2
파일3
파일4
그냥 모두 문자열로 보기때문에.. 뒷쪽에 숫자가 자연스럽지 못하죠
윈도우 탐색기에서도 정렬하면 다음과 같이 나옵니다.
위와같이 정렬하려면 어떻게 하면 될까요?
예전에 직접 String-Compare함수를 구현해서 정렬했는데..
오늘 StrCmpLogicalW 라는 함수가 있는것을 알았습니다.
참조
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8326&ref=8326
http://msdn.microsoft.com/en-us/library/bb759947(VS.85).aspx
위 링크를 참조하여 VCL의 TStringList를 이용하여 문자열 정렬을 구현해 보았습니다.
코딩은 간단한데
그림을 많이 넣다보니 길어지네요
[코딩]
StrCmpLogical 이라는 함수는 Shlwapi.dll 에 구현되어있습니다.
msdn보시면 아시겠지만 dll 버젼이 ver 5.5 이상이어야 되는것 같습니다.
//---------------------------------------------------------------------------
// 메모장의 문자열을 정렬하기
void __fastcall TForm1::Btn_NormalSortClick(TObject *Sender)
{
TStringList *lst=new TStringList;
lst->Assign(Memo1->Lines);
lst->Sort();
Memo1->Lines->Assign(lst);
delete lst;
}
//---------------------------------------------------------------------------
#include < Shlwapi.h >
#pragma comment(lib, "shlwapi.lib")
int __fastcall CompareFunc(TStringList* List, int Index1, int Index2)
{
String s1=List->Strings[Index1];
String s2=List->Strings[Index2];
return StrCmpLogicalW(s1.c_str(),s2.c_str());
}
// 메모장의 문자열을 LogicalSort하기
void __fastcall TForm1::Btn_LogicallSortClick(TObject *Sender)
{
TStringList *lst=new TStringList;
lst->Assign(Memo1->Lines);
lst->CustomSort(&CompareFunc);
Memo1->Lines->Assign(lst);
delete lst;
}
//---------------------------------------------------------------------------
델파이 버젼입니다.
function StrCmpLogicalW(str1: PChar; str2:PChar): integer; stdcall;
function StrCmpLogicalW; external 'shlwapi.dll' name 'StrCmpLogicalW';
implementation
{$R *.dfm}
function CompareFunc(List :TStringList;Index1:Integer;Index2:Integer): Integer;
var
s1,s2: string;
begin
s1:=List.Strings[Index1];
s2:=List.Strings[Index2];
Result:=StrCmpLogicalW(PChar(s1),PChar(s2));
end;
procedure TForm6.Btn_LogicallSortClick(Sender: TObject);
var
lst: TStringList;
begin
lst:=TStringList.Create;
lst.Assign(Memo1.Lines);
lst.CustomSort(CompareFunc);
Memo1.Lines.Assign(lst);
lst.Free;
end;
procedure TForm6.Btn_NormalSortClick(Sender: TObject);
var
lst: TStringList;
begin
lst:=TStringList.Create;
lst.Assign(Memo1.Lines);
lst.Sort;
Memo1.Lines.Assign(lst);
lst.Free;
end;
이상입니다.
|