李成俊 赵文杰
---- 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
这时,对每个记录