在VB里巧用集合
發表于:2007-07-14來源:作者:點擊數:
標簽:
李成俊 趙文杰 ---- VB 提 供 一 種 很 有 用 的 數 據 類 型 集 合(Collection)。 她 的 工 作 原 理 類 似 與C 里 的 鏈 表, 可 以 很 方 便 的 實 現 插 入, 刪 除。 并 且 在 使 用 了Key 之 后, 檢 索 操 作 也 變 得 非 常 簡 單。 但 其 編 程
李成俊 趙文杰
---- VB 提 供 一 種 很 有 用 的 數 據 類 型 集 合(Collection)。 她 的 工 作 原 理 類 似 與C 里 的 鏈 表, 可 以 很 方 便 的 實 現 插 入, 刪 除。 并 且 在 使 用 了Key 之 后, 檢 索 操 作 也 變 得 非 常 簡 單。 但 其 編 程 上 的 方 便 卻 帶 來 了 效 率 上 的 急 劇 下 降( 尤 其 在 大 數 據 量 時 會 讓 你 無 法 忍 受)。 以 下 舉 兩 個 例 子 來 討 論 一 下 怎 樣 把 集 合 和 數 組 結 合 使 用, 使 程 序 在 方 便 和 效 率 之 間 達 到 一 種 平 衡。
---- 1 . 要 求 建 立 一 數 據 結 構, 用 來 保 存 學 生 的 學 號, 姓 名 和 成 績, 并 在 需 要 時 以 成 績 的 高 低 按 順 序 輸 出 這 些 信 息。
---- 這 里 我 想 提 供 兩 種 解 決 方 法( 當 然 還 有 其 他 方 法)。
---- 第 一 種: 完 全 用 集 合 來 保 存 數 據。
---- 首 先 定 義 一 個 結 構 如 下( 該 結 構 同 時 用 與 第 二 種 方 式)
Type tMyType
ID As Long
Name As String
Score As Integer
End Type
再定義類clsData如下
Public ID As Long
Public Name As String
Public Score As Integer
并定義插入函數用來接受數據并插入到數據結構中
Public Function InsertToCol(pData As tMyType)
注釋:其中m_ColData保存記錄
Dim myClass As New clsData
Set myClass = Nothing
For iLoopCtrl = 1 To m_ColData.Count
If m_ColData(iLoopCtrl).Score
< = pData.Score Then Exit For
Next
myClass.ID = pData.ID
myClass.Name = pData.Name
myClass.Score = pData.Score
If m_ColData.Count = 0 Or iLoopCtrl
= m_ColData.Count Then
m_ColData.Add Item:=myClass
Else
m_ColIndex.Add Item:=myClass,
before:=iLoopCtrl
End If
End Function
這時,對每個記錄做處理如下
Public Function OutProcess()
For iLoopCtrl = 1 To m_ColData.Count
CurrentID = m_ColData(iLoopCtrl).ID
CurrentName = m_ColData(iLoopCtrl).Name
CurrentScore = m_ColData(iLoopCtrl).Score
注釋:對當前記錄做相應處理
Next
End Function
---- 第 二 種: 將 數 組 與 集 合 結 合 起 來, 用 數 組 保 存 數 據 而 用 集 合 保 存 排 序 信 息。
---- 首 先 定 義 如 下 變 量
Public m_Array(99) As tMyType
注釋:根據需要也可以定義成動態數組
Public m_ColIndex As New Collection
注釋:用來保存索引信息
向數組中插入數據的函數如下
Public Function InsertToArray(pData As tMyType)
If iCurIndex > 99 Then Exit Function
For iLoopCtrl = 1 To m_ColIndex.Count
If m_Array(m_ColIndex(iLoopCtrl)).Score
< = pData.Score Then Exit For
Next
If m_ColIndex.Count = 0 Or iLoopCtrl
= m_ColIndex.Count Then
m_ColIndex.Add iLoopCtrl - 1
Else
m_ColIndex.Add iLoopCtrl - 1, before:=iLoopCtrl
End If
m_Array(iCurIndex).ID = pData.ID
m_Array(iCurIndex).Name = pData.Name
m_Array(iCurIndex).Score = pData.Score
iCurIndex = iCurIndex + 1
End Function
這時,對每個記錄做處理如下
Public Function OutProcess()
For iLoopCtrl = 1 To m_ColData.Count
I = m_ColData(iLoopCtrl)
CurrentID = m_Array(I).ID
CurrentName = m_Array(I).Name
CurrentScore = m_Array(I).Score
注釋:對當前記錄做相應處理
Next
End Function
---- * 性 能 分 析
---- 對 于 集 合 來 講, 隨 著 記 錄 個 數 的 增 長, 對 集 合 的 操 作 效 率 飛 快 下 降。 因 為, 集 合 按 下 標 查 找 一 記 錄 時 首 先 從 集 合 的 頭 一 條 記 錄 開 始, 順 序 向 下, 直 到 指 定 的 下 標 位 置。 因 此, 訪 問m_ColData(99) 要 比 訪 問m_ColData(1) 慢 的 很 多。 而 大 家 都 知 道 數 組 在 內 存 中 是 順 序 存 放, 因 此, 訪 問 某 條 記 錄 的 效 率 與 下 標 大 小 無 關。 當 記 錄 數 或 每 個 記 錄 的 項 目 數 越 大, 效 率 的 提 高 越 明 顯。( 大 家 可 以 自 己 寫 一 些 測 試 程 序, 具 體 比 較 以 下 它 們 之 間 的 效 率 差 別, 會 感 到 非 常 驚 訝 的)
---- 2 . 當 記 錄 有 唯 一 關 鍵 字, 并 經 常 以 這 個 關 鍵 字 做 查 詢 時 可 以 使 用 以 下 方 法。
---- 定 義 用 于 保 存 數 據 的 結 構 和 結 構 數 組
Type tMyType
Item_1 As String
注釋:為關鍵字
Item_2 As String
Item_3 As String
End Type
Public m_Array() As tMyType
Public m_ColIndex As New Collection
注釋:用于保存索引的集合
定義用于保存索引信息的類clsIndex如下
Public Item_Key As String
Public ID_OfArray As Integer
當接受到一條記錄pData后插入過程如下
Public Function InsertData(pData As tMyType)
Dim myClass As New clsIndex
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.Add Item:=myClass, Key:=pData.Item_1
End Function
那么,當需要以給出的關鍵字(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
原文轉自:http://www.anti-gravitydesign.com