VB打造通用排序方法

来源:互联网 发布:巫师3低配置优化补丁 编辑:程序博客网 时间:2024/04/30 00:33
     C中的通用排序函数qsort真是个令我们这些垂死挣扎在vb代码中的人嫉妒的神通的金钥匙.想想一个qsort函数排序遍所有数据类型而且效率也挺好难道不爽快没?...痛啊!      .Net的FrameWorke 1.1也通过装箱(boxing)、拆箱(unboxing)机制和Object类是所有子类的根类实现了Array类的通用Sort方法;C++可以用摸板来打造通用的排序方法;C#2.0以上可以通过泛型类打造通用的排序方法.尽管它们实现的方法或许效率不是很好或许可能使你的程序越来越庞大,但仍不失为一种灵活的机制.      而vb呢?c的__cdecl不能调用(即使能调用也实现不了__cdecl形的比较函数)所以qsort的光一点也沾不了?C++摸板、C#2.0泛型?vb编译器不支持要想实现也不难自己把所有的数据类型都写一份呗!难道vb就不能在这方面占点边吗?当然能拉!(废话!)      在.Net的FrameWorke 1.1中的Array类中的Sort方法(具有IComparer类型的形参的)是建立在.Net装箱、拆箱基础上的.由于所有类最终的基类都是Object类所以可以通过Object来传输所有数据类型(其中的实现通过装箱、拆箱来实现)。要是想给自定义的数据类型的数组进行排序则必须自己实现一个继承自IComparer接口的类,IComparer接口的定义如下public interface IComparer{      int Compare(object x, object y);}实现了IComparer接口类只要调用Array类中具IComparer类型的形参的Sort方法就ok了?总结一下.以上思想在.net中之所以如此容易实现完全是因为Object类可以传输所有的数据类型.那么如果vb中也有一个Object一样的数据类型不就可以实现我们伟大的革命理想了吗?对!那就是Variant变量,虽然Variant不能像Object那样神通的支持所有的数据类型但它完全支持vb中的所有标准数据类型所以还是能满足了点点的吧.一下是我在vb中的实现思路:1,定义一个排序方法.其中必须传递两个参数:一个为数组,一个为Object类型的比较类的  对象(因为Oject对象在vb中可以传输所有对象),排序中遇到的比较约定调用比较类的  Compare方法;2,必须是现一个比较类.此类中必须实现原形为Function Compare(c1 As Variant, c2 As Variant) As Long的比较函数.ok!以下是具体实现的代码:'-------------------------------------------------------------------------'   通用的直接插入排序方法模块mSort'-------------------------------------------------------------------------'   通用的直接插入排序方法Sub InsertSort(List As Variant, CmpClass As Object)    Dim I As Long, J As Long    Dim Frist As Long, Last As Long    Dim dwTemp As Variant    If IsArray(List) = False Then Exit Sub    Frist = LBound(List)    Last = UBound(List)    Frist = Frist + 1    For I = Frist To Last        dwTemp = List(I)        J = I        Do While J >= Frist            If CmpClass.Compare(List(J - 1), dwTemp) <= 0 Then Exit Do            List(J) = List(J - 1)            J = J - 1        Loop        List(J) = dwTemp    NextEnd Sub'-------------------------------------------------------------------------'   比较类cCmpFn'-------------------------------------------------------------------------'比较函数Function Compare(c1 As Variant, c2 As Variant) As Long    Compare = c1 - c2End Function'-------------------------------------------------------------------------'  测试模块'-------------------------------------------------------------------------Const BTM = 100'Private test(BTM) As Currency ''Private test(BTM) As LongPrivate Test(BTM) As IntegerPrivate Sub btnOrder_Click()    Dim cmp As New cCmpFn    Call mSort.InsertSort(Test, cmp)    Call ReadArrayData2TextBox(txtDst, Test)End SubPrivate Sub btnRfh_Click()    Call Form_LoadEnd SubPrivate Sub Form_Load()    Dim I As Long    For I = 0 To BTM        Test(I) = Rnd * BTM    Next    Call ReadArrayData2TextBox(txtSrc, Test)End SubPrivate Sub ReadArrayData2TextBox(Tb As TextBox, Arr As Variant)    Dim I As Long    Dim buffer$    For I = 0 To BTM        buffer = buffer & Space$(2) & Arr(I)        If (I + 1) Mod 5 = 0 Then buffer = buffer & vbCrLf '每行10个元素    Next    Tb.Text = bufferEnd Sub代码示例中(还是实现了字符串的排序):下载
原创粉丝点击