代碼演示VB.NET文件名排序案例
作者:佚名
本文主要解決VB.NET文件名排序的問題,如果你輸入 : a1,a2,a10,a001 我們知道,如果按照字符串比較,結(jié)果應(yīng)該是 a001,a1,a10,a2,但我們期望的結(jié)果應(yīng)該是a001,a1,a2,a10.我們?yōu)槟憬鉀Q這個(gè)問題,代碼詳細(xì)。
文件多了我們找起來(lái)會(huì)很困難,我們現(xiàn)在來(lái)做一個(gè)關(guān)于VB.NET文件名排序的一個(gè)小案例,以后你的文件都會(huì)按一定的順序排列,也加快你的查詢速度。
VB.NET文件名排序案例:
輸入 : a1,a2,a10,a001 。我們知道,如果按照字符串比較,結(jié)果應(yīng)該是 a001,a1,a10,a2,但我們期望的結(jié)果應(yīng)該是a001,a1,a2,a10.
自己寫了一個(gè)VB.NET文件名排序算法,請(qǐng)參考,或者有更好的算法,請(qǐng)賜教
- VB.NET code /*
- 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<nText1Len?lpText1[nText1IndexHandled]:0;
- TCHAR chOffset2 = nText2IndexHandled<nText2Len?lpText2[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;
- }
【編輯推薦】
責(zé)任編輯:田樹
來(lái)源:
博客