---- 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  
|