原文地址:
http://blog.csdn.net/estyle/archive/2004/07/04/33828.aspx
欢迎转载!但请注明出处(原文地址)和我的姓名:靳田
谢谢啦! ^_^
本来打算把这篇文章也写成“浮想”的,但我觉得最近想得太多、务实太少。所以现在尽量把它写得务实一点吧!(尽力而为,这不是我的强项。)
前段时间做一个ASP的在线考试系统,多处使用到数组。但VBS的数组功能比较弱,于是我根据需要写了几个和数组相关的过程,作用不小哦!文章标题中提到的VBS过程就是其中两个,下面会贴出代码。
首先,我先问一个问题:在一个ASP项目中,需要对数组元素进行排序,说说你会怎么办?
用三十秒时间考虑考虑,然后继续往下看。
第一个函数是关于随机数组的,准确地说,是在一个数组中随机抽取指定数目的位置不重复元素组成新数组并返回。
如果是你写这样的函数,会怎么写呢?这可不是在考你,因为这本来就是一个简单的问题,很容易就能理出思路来。但是,很轻易就想出来的思路往往是传统的,虽然有效,但却不够高效。或许你认为,只要能解决问题就够了——不管黑猫白猫,能抓老鼠就是好猫!这个问题留在最后讨论,先看看我写的这个函数:
Function GetRandom(ByVal srcArr,ByVal tarNum)
'******************************************************
'
'作用:返回从源数组中随机抽取指定数目的位置不重复元素组成的新数组。
'参数:srcArr,源数组;tarNum,抽取位置不重复元素的数目。
'返回:数组
'作者:Estyle(靳田)
'注意:若tarNum大于源数组的元素个数或者小于等于0,函数可能出错。
'
'******************************************************
Dim srcNum,tarArr(),i,n
srcNum=UBound(srcArr)+1
Randomize
ReDim tarArr(tarNum-1)
For i=0 to tarNum-1
n=Int(Rnd*(srcNum-i))
tarArr(i)=srcArr(n)
srcArr(n)=srcArr(srcNum-1-i)
Next
GetRandom=tarArr
End Function
第二个是子过程,没有返回值,作用是把数组中重复的多余元素删除!也是比较简单的——可能相对上面那个要难一点。
感谢CSDN社区的fason(阿信),我是模仿他才写出这个过程的。如果让我自己写,不知道会不会把全球的迭代(还不习惯用递归)和判断都用完呢!当初看得fason兄的JScript实现的函数,着实眼前一亮!这个VBS版相比之下还是要差上一截,更何况是模仿的。向fason兄学习!
这个过程有一个缺陷,不能作用于元素是对象类型的数组……其实在我看来也不算缺陷,两个对象的比较是有悬念的,何况还不一定应用得到。下面是代码:
Sub DelRepeated(ByRef srcArr)
'******************************************************
'
'作用:从源数组中剔除多余的重复元素。
'参数:srcArr,源数组。
'返回:无
'作者:Estyle(靳田)
'注意:该函数对数值类型敏感,注意调用方法!
'
'******************************************************
Dim objDict,x
Set objDict=CreateObject("Scripting.Dictionary")
For Each x In srcArr
If Not objDict.Exists(x) Then
objDict.Add x,x
End If
Next
srcArr=objDict.Items
Set objDict=Nothing
End Sub
对这两个过程,我无须多说了吧?回头先讨论黑猫白猫的问题。
诚然,解决问题是最首要的任务。但如果不继续思考如何更好地解决问题,将至少导致两个方面的消极影响:
一、影响整个程序的执行效率!
同一作用的两个函数要体现性能差别是比较困难的,但如果不精益求精,程序中还有发展潜力的地方会有不少,这将直接导致整个程序的执行效率不佳。或许做开发的时候你体会不到,你也没有对自己的程序做详尽测试的习惯,但是如果你的程序应用在大压力的领域,使用者就会发现这个问题了——等他们把问题反馈给你就晚啦,很伤心的。
二、影响自己编程水平的提高!
这个就不用多说了吧?当然,作用时大时小,你也不用太过在意。
这篇文章没法总结,更多地需要大家自己思考!如果一定要总结,那就七个字:勇于创新,抄近道!
当然,不是所有情况都可以抄近道的,基本功还是要练好。
最后,回到最开始我们提出的数组排序的问题,你的答案是什么?难道你已经想好了一个非常简单、优雅而又高效的排序思路?
如果还没有,那为什么不用JScript中数组对象现成的sort()方法呢?——习惯成自然吧,ASP绝大部分情况下是依赖VBS的,但除了易学易用以外,VBS和JScript相比的确弱了一些。
我毕竟也很菜,厚着脸皮把自己觉得能说的都说了。——如果你不屑,大可一笑置之,不要丢我。