top
Loading...
在VB里巧用集合
B提供一種很有用的數據類型集合(Collection)。 她的工作原理類似與C里的鏈表,可以很方便的實現插入,刪除。并且在使用了Key之后,檢索 操作也變得非常簡單。但其編程上的方便卻帶來了效率上的急劇下降(尤其在大數據量時會 讓你無法忍受)。以下舉兩個例子來討論一下怎樣把集合和數組結合使用,使程序在方便和效 率之間達到一種平衡。

1.要求建立一數據結構,用來保存學生的學號, 姓名和成績,并在需要時以成績的高低按順序輸出這些信息。

這里我想提供兩種解決方法(當然還有其他方法)。

第一種:完全用集合來保存數據。

首先定義一個結構如下(該結構同時用與第二種 方式)

TypetMyTypeIDAsLongNameAsStringScoreAsIntegerEndType再定義類clsData如下PublicIDAsLongPublicNameAsStringPublicScoreAsInteger并定義插入函數用來接受數據并插入到數據結構中PublicFunctionInsertToCol(pDataAstMyType)其中m_ColData保存記錄DimmyClassAsNewclsDataSetmyClass=NothingForiLoopCtrl=1Tom_ColData.CountIfm_ColData(iLoopCtrl).Score<=pData.ScoreThenExitForNextmyClass.ID=pData.IDmyClass.Name=pData.NamemyClass.Score=pData.ScoreIfm_ColData.Count=0OriLoopCtrl=m_ColData.CountThenm_ColData.AddItem:=myClassElsem_ColIndex.AddItem:=myClass,before:=iLoopCtrlEndIfEndFunction這時,對每個記錄做處理如下PublicFunctionOutProcess()ForiLoopCtrl=1Tom_ColData.CountCurrentID=m_ColData(iLoopCtrl).IDCurrentName=m_ColData(iLoopCtrl).NameCurrentScore=m_ColData(iLoopCtrl).Score對當前記錄做相應處理NextEndFunction
第二種:將數組與集合結合起來,用數組保存數據而 用集合保存排序信息。

首先定義如下變量

Publicm_Array(99)AstMyType根據需要也可以定義成動態數組Publicm_ColIndexAsNewCollection用來保存索引信息向數組中插入數據的函數如下PublicFunctionInsertToArray(pDataAstMyType)IfiCurIndex>99ThenExitFunctionForiLoopCtrl=1Tom_ColIndex.CountIfm_Array(m_ColIndex(iLoopCtrl)).Score<=pData.ScoreThenExitForNextIfm_ColIndex.Count=0OriLoopCtrl=m_ColIndex.CountThenm_ColIndex.AddiLoopCtrl-1Elsem_ColIndex.AddiLoopCtrl-1,before:=iLoopCtrlEndIfm_Array(iCu   dex).ID=pData.IDm_Array(iCurIndex).Name=pData.Namem_Array(iCurIndex).Score=pData.ScoreiCurIndex=iCurIndex+1EndFunction這時,對每個記錄做處理如下PublicFunctionOutProcess()ForiLoopCtrl=1Tom_ColData.CountI=m_ColData(iLoopCtrl)CurrentID=m_Array(I).IDCurrentName=m_Array(I).NameCurrentScore=m_Array(I).Score對當前記錄做相應處理NextEndFunction
*性能分析

對于集合來講,隨著記錄個數的增長,對集合的操 作效率飛快下降。因為,集合按下標查找一記錄時首先從集合的頭一條記錄開始,順序向下, 直到指定的下標位置。因此,訪問m_ColData(99)要比訪問m_ColData(1)慢的很多。而大家 都知道數組在內存中是順序存放,因此,訪問某條記錄的效率與下標大小無關。當記錄數或 每個記錄的項目數越大,效率的提高越明顯。(大家可以自己寫一些測試程序,具體比較以 下它們之間的效率差別,會感到非常驚訝的)

2.當記錄有唯一關鍵字,并經常以這個關鍵字 做查詢時可以使用以下方法。

定義用于保存數據的結構和結構數組

TypetMyTypeItem_1AsString為關鍵字Item_2AsStringItem_3AsStringEndTypePublicm_Array()AstMyTypePublicm_ColIndexAsNewCollection用于保存索引的集合定義用于保存索引信息的類clsIndex如下PublicItem_KeyAsStringPublicID_OfArrayAsInteger當接受到一條記錄pData后插入過程如下PublicFunctionInsertData(pDataAstMyType)DimmyClassAsNewclsIndexID_OfArray=ID_OfArray+1m_Array(ID_OfArray).Item_1=pData.Item_1m_Array(ID_OfArray).Item_2=pData.Item_2m_Array(ID_OfArray).Item_3=pData.Item_3myClass.Item_Key=pData.Item_1myClass.ID_OfArray=ID_OfArraym_ColIndex.AddItem:=myClass,Key:=pData.Item_1EndFunction那么,當需要以給出的關鍵字(mKey)取得數據時,用以下方法實現Current_Item1=m_Array(myClass(mKey).ID_OfArray).Item_1Current_Item2=m_Array(myClass(mKey).ID_OfArray).Item_2Current_Item3=m_Array(myClass(mKey).ID_OfArray).Item_3
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗