C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1081] [Algorithm] 정렬(Sort) 윈도우 탐색기 처럼..
장성호 [nasilso] 9970 읽음    2012-03-25 00:15
음..

다음과 같은 파일명 리스트가 있다고 합시다.
파일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;



이상입니다.
김태선 [cppbuilder]   2012-03-25 09:29 X
좋은 팁이군요. ^^
망치 [mangchy]   2012-03-27 08:04 X
좋네요...가끔 정렬할때 고민하던 부분이었는데...
leo21c [leo21c]   2012-11-21 15:46 X
정말 필요했던건데~ 정보 감사합니다.

+ -

관련 글 리스트
1081 [Algorithm] 정렬(Sort) 윈도우 탐색기 처럼.. 장성호 9970 2012/03/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.