找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: 宣传软件

vb.net排序文件名算法和实例教程

[复制链接]

44

主题

62

回帖

918

积分

软件定制初级客户

积分
918
发表于 2016-11-15 13:28:41 | 显示全部楼层 |阅读模式
文件多了我们找起来会很困难,我们现在来做一个关于VB.NET文件名排序的一个小案例,以后你的文件都会按一定的顺序排列,也加快你的查询速度。
VB.NET文件名排序案例:
输入 : a1,a2,a10,a001 。我们知道,如果按照字符串比较,结果应该是 a001,a1,a10,a2,但我们期望的结果应该是a001,a1,a2,a10.
自己写了一个VB.NET文件名排序算法,请参考,或者有更好的算法,请赐教
  • 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;  
  • }

qq.jpg

44

主题

62

回帖

918

积分

软件定制初级客户

积分
918
 楼主| 发表于 2016-11-15 13:29:44 | 显示全部楼层

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

  }


0

主题

576

回帖

615

积分

软件网站元老会员

积分
615
发表于 2016-11-27 07:59:46 | 显示全部楼层
好店家。感谢,感谢。

0

主题

573

回帖

625

积分

软件网站元老会员

积分
625
发表于 2016-11-27 17:08:14 | 显示全部楼层
,服务很好,功能也是按要求做的。主要是服务,还有教程,客服都是分工的挺好的。推荐!!

0

主题

552

回帖

591

积分

软件网站元老会员

积分
591
发表于 2016-11-27 18:32:38 | 显示全部楼层
。视频也清晰。感谢店家感谢淘宝。

0

主题

526

回帖

603

积分

软件网站元老会员

积分
603
发表于 2016-11-28 03:03:44 | 显示全部楼层
卖家,技术过硬,服务过好,就像巴黎欧莱雅,你值得拥有

0

主题

504

回帖

519

积分

软件网站元老会员

积分
519
发表于 2016-11-28 16:13:39 | 显示全部楼层
错效率很高价格合理还会来的

0

主题

609

回帖

669

积分

软件网站元老会员

积分
669
发表于 2016-11-28 18:06:56 | 显示全部楼层
衍了事的嫌疑

0

主题

544

回帖

602

积分

软件网站元老会员

积分
602
发表于 2016-11-29 01:53:01 | 显示全部楼层
,看样子好不错给个好评,已经习惯了

0

主题

578

回帖

624

积分

软件网站元老会员

积分
624
发表于 2016-11-29 04:54:26 | 显示全部楼层
及时做出评价,系统默认好评!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-10-22 18:10

安卓脚本软件 · 键鼠盒子 · HID · 机械臂

快速回复 返回顶部 返回列表

随机推荐 · 热帖 / 新帖 / 随便看看

社区会员(随机展示)