当前位置:首页 > 开发教程 > VB.NET教程 >

排序文件名算法

时间:2013-09-18 11:51 来源: 作者: 收藏

2345软件教程,为您打造全面的软件教程手册,无论是新奇小软件的操作还是专业软件的使用技巧,2345软件教程都会为您解疑释惑。

核心提示:我们知道,如果按照字符串比较,结果应该是 a001,a1,a10,a2,但我们期望的结果应该是

输入 : a1,a2,a10,a001

我们知道,如果按照字符串比较,结果应该是 a001,a1,a10,a2,但我们期望的结果应该是a001,a1,a2,a10.

自己写了一个算法,请参考,或者有更好的算法,请赐教

/*

Return Value Description

< 0  arg1 less than arg2

0  arg1 equivalent to arg2

> 0  arg1 greater than arg2

*/

int compare(const void* arg1,const void* arg2)

{

if (NULL==arg1||NULL==arg2)//address of item

return 0;

LPSTR lpText1 = *( TCHAR** )arg1; //content of item

LPSTR lpText2 = *( TCHAR** )arg2; //content of item

if (NULL==lpText1||NULL==lpText2)

return 0;

int nText1Len = _tcslen(lpText1);

int nText2Len = _tcslen(lpText2);

int nText1IndexHandled = 0;

int nText2IndexHandled = 0;

int nRet = 0;

for (;;)

{

if (nText1IndexHandled==nText1Len||nText2IndexHandled==nText2Len) //don't compare complete since all are same, "ab","abc"

{

TCHAR chOffset1 = nText1IndexHandled<nText1LenlpText1[nText1IndexHandled]:0;

TCHAR chOffset2 = nText2IndexHandled<nText2LenlpText2[nText2IndexHandled]:0;

nRet = (int)((WORD)chOffset1-(WORD)chOffset2);

break;

}

TCHAR ch1 = *(lpText1+nText1IndexHandled);

TCHAR ch2 = *(lpText2+nText2IndexHandled);

if (isdigit(ch1)&&isdigit(ch2)) // if digit, change to number and compare

{

TCHAR* lpNum1 = new TCHAR[nText1Len];

TCHAR* lpNum2 = new TCHAR[nText2Len];

if (NULL==lpNum1||NULL==lpNum2)

return 0;

memset(lpNum1,0,nText1Len*sizeof(TCHAR));

memset(lpNum2,0,nText2Len*sizeof(TCHAR));

extractnumber(lpText1,nText1Len,nText1IndexHandled,lpNum1);

extractnumber(lpText2,nText2Len,nText2IndexHandled,lpNum2);

nRet = comparenumber(lpNum1,lpNum2);

delete[] lpNum1;

delete[] lpNum2;

}

else

{

nRet = (int)((WORD)ch1-(WORD)ch2);

nText1IndexHandled++;

nText2IndexHandled++;

}

if (nRet!=0)

break;

}

return nRet;

}

TCHAR* extractnumber(TCHAR* lpBuf,int nLen,int& nIndexBegin,TCHAR* lpNumber)

{

if (NULL==lpBuf||NULL==lpNumber)

return lpNumber;

for (int i=nIndexBegin,nIndex=0;i<nLen;++i,++nIndexBegin)

{

TCHAR ch = *(lpBuf+i);

if (!isdigit(ch))

break;

lpNumber[nIndex++]=ch;

}

return lpNumber;

}

int comparenumber(TCHAR* lpNumber1,TCHAR* lpNumber2)

{

if (NULL==lpNumber1||NULL==lpNumber2)

return 0;

int nNum1Len = _tcslen(lpNumber1);

int nNum2Len = _tcslen(lpNumber2);

int nMaxLen = max(nNum1Len,nNum2Len);

TCHAR* lpFormatNum1 = new TCHAR[nMaxLen+1];

TCHAR* lpFormatNum2 = new TCHAR[nMaxLen+1];

if (NULL==lpFormatNum1||NULL==lpFormatNum2)

return 0;

memset(lpFormatNum1,_T('0'),nMaxLen*sizeof(TCHAR));

memset(lpFormatNum2,_T('0'),nMaxLen*sizeof(TCHAR));

lpFormatNum1[nMaxLen]=0;

lpFormatNum2[nMaxLen]=0;

int nPos = 0, nRet = 0;

int nIndex = nMaxLen-1;

for (nPos=nNum1Len-1;nPos>=0;--nPos)

lpFormatNum1[nIndex--]=lpNumber1[nPos];

nIndex = nMaxLen-1;

for (nPos=nNum2Len-1;nPos>=0;--nPos)

lpFormatNum2[nIndex--]=lpNumber2[nPos];

for (nPos=0;nPos<nMaxLen;++nPos)

{

nRet = lpFormatNum1[nPos]-lpFormatNum2[nPos];

if (nRet!=0)

break;

}

delete[] lpFormatNum1;

delete[] lpFormatNum2;

return nRet;

}


VB.NET教程阅读排行

最新文章