阅读教程

vb.net排序文件名算法

[日期:2008-06-26] 来源:  作者:志伟

输入 : 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<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;

}



      
      使用百度搜索:vb.net排序文件名算法百度中搜索:vb.net排序文件名算法
阅读:
录入:志伟

评论 】 【 推荐 】 【 打印
上一篇:
下一篇:[推荐]最新.NET开发规范标准
本文评论       全部评论
发表评论


点评: 字数
姓名:

 
搜一下


 
本周热门教程
 

关于我们 | 广告合作 | 法律声明 | 联系站长 | 网站地图 | 网站搜索 | | Top ↑
Copyright © 志伟教程资料网 Powered by zhiweinet 1.0
 本栏目提供:vb.net排序文件名算法