程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 在VB裡巧用數據類型集合

在VB裡巧用數據類型集合

編輯:VB綜合教程
----VB提供一種很有用的數據類型集合(Collection)。她的工作原理類似與C裡的鏈表,可以很方便的實現插入,刪除。並且在使用了Key之後,檢索操作也變得非常簡單。但其編程上的方便卻帶來了效率上的急劇下降(尤其在大數據量時會讓你無法忍受)。以下舉兩個例子來討論一下怎樣把集合和數組結合使用,使程序在方便和效率之間達到一種平衡。
  ----1.要求建立一數據結構,用來保存學生的學號,姓名和成績,並在需要時以成績的高低按順序輸出這些信息。
  
  ----這裡我想提供兩種解決方法(當然還有其他方法)。
  
  ----第一種:完全用集合來保存數據。
  
  ----首先定義一個結構如下(該結構同時用與第二種方式)
  
  TypetMyType
  IDAsLong
  NameAsString
  ScoreAsInteger
  EndType
  再定義類clsData如下
  PublicIDAsLong
  PublicNameAsString
  PublicScoreAsInteger
  並定義插入函數用來接受數據並插入到數據結構中
  PublicFunctionInsertToCol(pDataAstMyType)
  '其中m_ColData保存記錄
  DimmyClassAsNewclsData
  SetmyClass=Nothing
  ForiLoopCtrl=1Tom_ColData.Count
  Ifm_ColData(iLoopCtrl).Score
  <=pData.ScoreThenExitFor
  Next
  myClass.ID=pData.ID
  myClass.Name=pData.Name
  myClass.Score=pData.Score
  Ifm_ColData.Count=0OriLoopCtrl
  =m_ColData.CountThen
  m_ColData.AddItem:=myClass
  Else
  m_ColIndex.AddItem:=myClass,
  before:=iLoopCtrl
  EndIf
  EndFunction
  這時,對每個記錄做處理如下
  PublicFunctionOutProcess()
  ForiLoopCtrl=1Tom_ColData.Count
  CurrentID=m_ColData(iLoopCtrl).ID
  CurrentName=m_ColData(iLoopCtrl).Name
  CurrentScore=m_ColData(iLoopCtrl).Score
  '對當前記錄做相應處理
  Next
  EndFunction
  
  ----第二種:將數組與集合結合起來,用數組保存數據而用集合保存排序信息。
  ----首先定義如下變量
  
  Publicm_Array(99)AstMyType
  '根據需要也可以定義成動態數組
  Publicm_ColIndexAsNewCollection
  '用來保存索引信息
  向數組中插入數據的函數如下
  PublicFunctionInsertToArray(pDataAstMyType)
  IfiCurIndex>99ThenExitFunction
  ForiLoopCtrl=1Tom_ColIndex.Count
  Ifm_Array(m_ColIndex(iLoopCtrl)).Score
  <=pData.ScoreThenExitFor
  Next
  Ifm_ColIndex.Count=0OriLoopCtrl
  =m_ColIndex.CountThen
  m_ColIndex.AddiLoopCtrl-1
  Else
  m_ColIndex.AddiLoopCtrl-1,before:=iLoopCtrl
  EndIf
  m_Array(iCurIndex).ID=pData.ID
  m_Array(iCurIndex).Name=pData.Name
  m_Array(iCurIndex).Score=pData.Score
  iCurIndex=iCurIndex 1
  EndFunction
  
  這時,對每個記錄做處理如下
  
  PublicFunctionOutProcess()
  ForiLoopCtrl=1Tom_ColData.Count
  I=m_ColData(iLoopCtrl)
  CurrentID=m_Array(I).ID
  CurrentName=m_Array(I).Name
  CurrentScore=m_Array(I).Score
  '對當前記錄做相應處理
  Next
  EndFunction
  
  ----*性能分析
  ----對於集合來講,隨著記錄個數的增長,對集合的操作效率飛快下降。因為,集合按下標查找一記錄時首先從集合的頭一條記錄開始,順序向下,直到指定的下標位置。因此,訪問m_ColData(99)要比訪問m_ColData(1)慢的很多。而大家都知道數組在內存中是順序存放,因此,訪問某條記錄的效率與下標大小無關。當記錄數或每個記錄的項目數越大,效率的提高越明顯。(大家可以自己寫一些測試程序,具體比較以下它們之間的效率差別,會感到非常驚訝的)
  
  ----2.當記錄有唯一關鍵字,並經常以這個關鍵字做查詢時可以使用以下方法。
  
  ----定義用於保存數據的結構和結構數組
  
  TypetMyType
  Item_1AsString
  '為關鍵字
  Item_2AsString
  Item_3AsString
  EndType
  Publicm_Array()AstMyType
  Publicm_ColIndexAsNewCollection
  '用於保存索引的集合
  定義用於保存索引信息的類clsIndex如下
  PublicItem_KeyAsString
  PublicID_OfArrayAsInteger
  當接受到一條記錄pData後插入過程如下
  PublicFunctionInsertData(pDataAstMyType)
  DimmyClassAsNewclsIndex
  ID_OfArray=ID_OfArray 1
  m_Array(ID_OfArray).Item_1=pData.Item_1
  m_Array(ID_OfArray).Item_2=pData.Item_2
  m_Array(ID_OfArray).Item_3=pData.Item_3
  myClass.Item_Key=pData.Item_1
  myClass.ID_OfArray=ID_OfArray
  m_ColIndex.AddItem:=myClass,Key:=pData.Item_1
  EndFunction
  那麼,當需要以給出的關鍵字(mKey)
  取得數據時,用以下方法實現
  Current_Item1=m_Array(myClass(mKey)
  .ID_OfArray).Item_1
  Current_Item2=m_Array(myClass(mKey)
  .ID_OfArray).Item_2
  Current_Item3=m_Array(myClass(mKey)
  .ID_OfArray).Item_3->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved