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

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

[复制链接]

65

主题

111

回帖

1557

积分

软件定制初级客户

积分
1557
发表于 2016-11-19 16:23:22 | 显示全部楼层 |阅读模式


VB.NET编程语言的应用,帮助开发人员在一定程度上提高了程序开发效率。而且其应用范围比较广泛,使用技巧多样化。比如在对文件的操作上就能够体会到它的功能强大性。首先让我们一起来了解一下VB.NET文件名排序的相关算法。
输入 : a1,a2,a10,a001
我们知道,如果按照字符串比较,结果应该是 a001,a1,a10,a2,但我们期望的结果应该是a001,a1,a2,a10.
自己写了一个VB.NET文件名排序的算法,请参考,或者有更好的算法,请赐教
  • /*
  • 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文件名排序的相关算法就为大家介绍到这里。

qq.jpg

65

主题

111

回帖

1557

积分

软件定制初级客户

积分
1557
 楼主| 发表于 2016-11-19 16:24:22 | 显示全部楼层
文件多了我们找起来会很困难,我们现在来做一个关于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;  
  • }

65

主题

111

回帖

1557

积分

软件定制初级客户

积分
1557
 楼主| 发表于 2016-11-19 16:25:03 | 显示全部楼层
七种常见的VB排序算法示例程序
加入了微秒级的计时器,各种不同算法的速度马上就能比较出来了,有的算法还真的是从没听说过,看也看不懂。

cmbSorts.AddItem "冒泡排序法"
cmbSorts.AddItem "插入排序法"
cmbSorts.AddItem "Bucket排序法"
cmbSorts.AddItem "选择排序法"
cmbSorts.AddItem "Shell排序法"
cmbSorts.AddItem "快速排序法"
cmbSorts.AddItem "Heap排序法

[附件已丢失]




Center.jpg

0

主题

579

回帖

632

积分

软件网站元老会员

积分
632
发表于 2016-11-28 13:53:46 | 显示全部楼层
信誉,值得好评!

0

主题

1184

回帖

2

积分

软件网站新手

积分
2
发表于 2016-11-29 01:31:58 | 显示全部楼层
强大,便捷高效,店家也热情,非常满意

0

主题

591

回帖

677

积分

软件网站元老会员

积分
677
发表于 2016-11-29 12:15:31 | 显示全部楼层
不了,还要一个个试,我晕!

0

主题

535

回帖

598

积分

软件网站元老会员

积分
598
发表于 2016-11-29 14:54:10 | 显示全部楼层
是我第二家店铺也是找他们公司弄的,售后不错非常好的,卖家值得选择的。至少我目前是比较满意的。O(∩_∩)O~,值

0

主题

540

回帖

576

积分

软件网站元老会员

积分
576
发表于 2016-11-29 23:54:06 | 显示全部楼层
格合理,耐心沟通修改,一步到位!!!

0

主题

848

回帖

1005

积分

软件网站中级元老会员

积分
1005
发表于 2016-11-30 01:10:41 | 显示全部楼层
这个有点问题吧。

0

主题

607

回帖

646

积分

软件网站元老会员

积分
646
发表于 2016-11-30 04:51:13 | 显示全部楼层
很快效果也很完美,特别感谢技术加班帮忙制作!@!@~~客服沟通也很愉快,好多不明白的地方客服也都耐心解答,辛苦啦
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-10-22 11:26

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

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

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

社区会员(随机展示)