代码演示VB.NET文件名排序案例

开发 后端
本文主要解决VB.NET文件名排序的问题,如果你输入 : a1,a2,a10,a001 我们知道,如果按照字符串比较,结果应该是 a001,a1,a10,a2,但我们期望的结果应该是a001,a1,a2,a10.我们为你解决这个问题,代码详细。

文件多了我们找起来会很困难,我们现在来做一个关于VB.NET文件名排序的一个小案例,以后你的文件都会按一定的顺序排列,也加快你的查询速度。

VB.NET文件名排序案例:

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

自己写了一个VB.NET文件名排序算法,请参考,或者有更好的算法,请赐教

  1. VB.NET code /*  
  2. Return Value Description  
  3. < 0  arg1 less than arg2  
  4. 0  arg1 equivalent to arg2  
  5. > 0  arg1 greater than arg2  
  6. */  
  7. int compare(const void* arg1,const void* arg2)  
  8. {  
  9. if (NULL==arg1||NULL==arg2)//address of item  
  10. return 0;  
  11. LPSTR lpText1 = *( TCHAR** )arg1; //content of item  
  12. LPSTR lpText2 = *( TCHAR** )arg2; //content of item  
  13. if (NULL==lpText1||NULL==lpText2)  
  14. return 0;  
  15. int nText1Len = _tcslen(lpText1);  
  16. int nText2Len = _tcslen(lpText2);  
  17. int nText1IndexHandled = 0;  
  18. int nText2IndexHandled = 0;  
  19. int nRet = 0;  
  20. for (;;)  
  21. {  
  22. if (nText1IndexHandled==nText1Len||nText2IndexHandled==nText2Len) //don't compare complete since all are same, "ab","abc"  
  23. {  
  24. TCHAR chOffset1 = nText1IndexHandled<nText1Len?lpText1[nText1IndexHandled]:0;  
  25. TCHAR chOffset2 = nText2IndexHandled<nText2Len?lpText2[nText2IndexHandled]:0;  
  26. nRet = (int)((WORD)chOffset1-(WORD)chOffset2);  
  27. break;  
  28. }  
  29. TCHAR ch1 = *(lpText1+nText1IndexHandled);  
  30. TCHAR ch2 = *(lpText2+nText2IndexHandled);  
  31. if (isdigit(ch1)&&isdigit(ch2)) // if digit, change to number and compare  
  32. {  
  33. TCHAR* lpNum1 = new TCHAR[nText1Len];  
  34. TCHAR* lpNum2 = new TCHAR[nText2Len];  
  35. if (NULL==lpNum1||NULL==lpNum2)  
  36. return 0;  
  37. memset(lpNum1,0,nText1Len*sizeof(TCHAR));  
  38. memset(lpNum2,0,nText2Len*sizeof(TCHAR));  
  39. extractnumber(lpText1,nText1Len,nText1IndexHandled,lpNum1);  
  40. extractnumber(lpText2,nText2Len,nText2IndexHandled,lpNum2);  
  41. nRet = comparenumber(lpNum1,lpNum2);  
  42. delete[] lpNum1;  
  43. delete[] lpNum2;  
  44. }  
  45. else  
  46. {  
  47. nRet = (int)((WORD)ch1-(WORD)ch2);  
  48. nText1IndexHandled++;  
  49. nText2IndexHandled++;  
  50. }  
  51. if (nRet!=0)  
  52. break;  
  53. }  
  54. return nRet;  
  55. }  
  56. TCHAR* extractnumber(TCHAR* lpBuf,int nLen,int& nIndexBegin,TCHAR* lpNumber)  
  57. {  
  58. if (NULL==lpBuf||NULL==lpNumber)  
  59. return lpNumber;  
  60. for (int i=nIndexBegin,nIndex=0;i<nLen;++i,++nIndexBegin)  
  61. {  
  62. TCHAR ch = *(lpBuf+i);  
  63. if (!isdigit(ch))  
  64. break;  
  65. lpNumber[nIndex++]=ch;  
  66. }  
  67. return lpNumber;  
  68. }  
  69. int comparenumber(TCHAR* lpNumber1,TCHAR* lpNumber2)  
  70. {  
  71. if (NULL==lpNumber1||NULL==lpNumber2)  
  72. return 0;  
  73. int nNum1Len = _tcslen(lpNumber1);  
  74. int nNum2Len = _tcslen(lpNumber2);  
  75. int nMaxLen = max(nNum1Len,nNum2Len);  
  76. TCHAR* lpFormatNum1 = new TCHAR[nMaxLen+1];  
  77. TCHAR* lpFormatNum2 = new TCHAR[nMaxLen+1];  
  78. if (NULL==lpFormatNum1||NULL==lpFormatNum2)  
  79. return 0;  
  80. memset(lpFormatNum1,_T('0'),nMaxLen*sizeof(TCHAR));  
  81. memset(lpFormatNum2,_T('0'),nMaxLen*sizeof(TCHAR));  
  82. lpFormatNum1[nMaxLen]=0;  
  83. lpFormatNum2[nMaxLen]=0;  
  84. int nPos = 0nRet = 0;  
  85. int nIndex = nMaxLen-1;  
  86. for (nPos=nNum1Len-1;nPos>=0;--nPos)  
  87. lpFormatNum1[nIndex--]=lpNumber1[nPos];  
  88. nIndex = nMaxLen-1;  
  89. for (nPos=nNum2Len-1;nPos>=0;--nPos)  
  90. lpFormatNum2[nIndex--]=lpNumber2[nPos];  
  91. for (nPos=0;nPos<nMaxLen;++nPos)  
  92. {  
  93. nRet = lpFormatNum1[nPos]-lpFormatNum2[nPos];  
  94. if (nRet!=0)  
  95. break;  
  96. }  
  97. delete[] lpFormatNum1;  
  98. delete[] lpFormatNum2;  
  99. return nRet;  

【编辑推荐】

  1. 实例讲述VB.NET使用Log4Net
  2. 三分钟学会VB.NET转换形态
  3. VB.NET获取硬盘信息四大法宝
  4. 讲述VB.NET调用Excel的好处
  5. 简单例子概述VB.NET新窗体
责任编辑:田树 来源: 博客
相关推荐

2010-01-14 10:07:08

VB.NET文件名排序

2009-11-02 11:13:06

VB.NET读写文件

2009-11-02 09:45:23

VB.NET文件系统对

2009-11-03 11:06:40

VB.NET事件

2009-10-29 13:46:14

VB.NET DES加

2009-10-26 11:04:36

VB.NET UDP协

2009-11-03 10:18:46

VB.NET继承

2009-10-29 15:02:04

VB.NET文件排序

2009-10-29 14:02:24

VB和VB.NET比较

2009-11-02 10:53:34

VB.NET INI文

2009-10-28 15:18:46

VB.NET网络应用

2009-11-02 16:55:50

VB.NET Smar

2009-10-28 11:27:34

VB.NET资源文件

2009-10-26 14:50:18

VB.NET遍历注册表

2009-10-26 10:30:57

VB.NET处理FTP

2009-10-29 16:46:32

VB.NET语言

2010-01-20 13:42:10

VB.NET访问INIGetPrivateP

2009-10-27 16:36:46

VB.NET文件流

2009-10-26 09:50:20

VB.NET Star

2009-10-30 13:31:06

VB.NET名空间
点赞
收藏

51CTO技术栈公众号