VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 用两分法搜索列表框或组合框中的数据
发表评论(0)作者:, 平台:, 阅读:14198, 日期:2000-03-12
用两分法搜索列表框或组合框中的数据



下面的函数能让你在一个已作升序排列的列表框或组合框中查找符合条件的数据。

你可以实现精确查找或模糊查找。对这个程序稍微变一下,你就可以在一组已排好

序的数组中查找符合条件的数据。该方法的主要好处是对于大量的数据的查找,速

度非常之快。例如,一个列表框中有1024条数据,用此法查找只须重复十次,而用

传统的方法则要重复512次;如果数据量翻倍,用此法的重复次数为11次,而传统

的方法重复的次数也会翻倍。


Windows API提供了四个消息来实现上述的功能。对于列表框是:LB_FINDSTRING和

LB_FINDSTRINGEXACT;对于组合框是:CB_FINDSTRING和CB_FINDSTRINGEXACT。但

下面的程序则不分列表框和组合框,只要事先对其中的数据排序即可。 代码如下:




?

Function FindExact(Control As Control, Searched As String, _

Optional StartingIndex As Variant)


Dim I As Long, j As Long, k As Long


FindExact = -1

I = Iif(IsMissing(StartingIndex), 0, StartingIndex)

j = Control.ListCount - 1

Do



If I > j Then Exit Function


k = (I + j) / 2



Select Case StrComp(Control.List(k), Searched)

Case 0: Exit Do

Case -1: I = k + 1

Case 1: j = k - 1

End Select

Loop



Do While k > 0

If StrComp(Control.List(k - 1), Searched) Then

Exit Do

End If

k = k - 1

Loop

FindExact = k


End Function



Function FindPartial(Control As Control, Searched As String, _

Optional StartingIndex As Variant)

Dim I As Long, j As Long, k As Long, lun As Long


FindPartial = -1

I = Iif(IsMissing(StartingIndex), 0, StartingIndex)

j = Control.ListCount - 1

lun = Len(Searched)

Do



If I > j Then Exit Function


k = (I + j) / 2



Select Case StrComp(Left(Control.List(k), lun), Searched)

Case 0: Exit Do

Case -1: I = k + 1

Case 1: j = k - 1

End Select

Loop



Do While k > 0

If StrComp(Left(Control.List(k - 1), lun), Searched) Then

Exit Do

End If

k = k - 1

Loop

FindPartial = k


End Function


程序用法如下:


Index = FindExact(Control, Searched[, StartingIndex])

Index = FindPartial(Control, Searched[, StartingIndex])


其中Control代表列表框或组合框的名称,Searched表示搜索条件,StartingIndex

为可选参数,表示从哪里开始搜索。函数的返回值为符合条件的数据的索引值。如

果未找到符合条件的数据,则返回值为-1.