`

Delphi中的THashedStringList对象 --大数据量时

阅读更多

 

Delphi中的THashedStringList对象

摘自:http://apps.hi.baidu.com/share/detail/16962402

有许多程序员都喜欢使用TStringList类作为键值存储,这是不错的用法。但是 TStringList本身只是对数据线性的存储,当数据量大时,对其检索效率极为低下。Delphi在在IniFiles 单元中定义了另一个TStringList类,采用了哈希技术存储数据,它就是THashedStringList类。下面这段代码就是摘自 IniFiles单元中对THashedStringList的定义。

 

THashedStringList = class(TStringList)
private
    FValueHash: TStringHash;
    FNameHash: TStringHash;
    FValueHashValid: Boolean;
    FNameHashValid: Boolean;
    procedure UpdateValueHash;
    procedure UpdateNameHash;
protected
    procedure Changed; override;
public
    destructor Destroy; override;
    function IndexOf(const S: string): Integer; override;
    function IndexOfName(const Name: string): Integer; override;
end;
    基本的TStringList类是使用数组以线性方式保存所有子项的,所以无论使用其IndexOf方法还是IndexOfName方法都是使用线性查找 法,这种查寻方法的时间复杂度在最好情况为T(1),即第一个子项即为查询项,最坏情况为T(N),N为子项个数,即查找项为最后一项。所以,当数据量比 较大时其查询是毫无效率可言的。

    THashedStringList类中添加了两个TStringHash私有成员,分别用来存放对其子项键名哈希表和键值哈希表。当调用其 IndexOf方法或是IndexOfName方法时,此类会首先检查是否已经为键值或是键名创建哈希表,如果没有,则创建之,否则直接使用哈希算法时行 查找。

function THashedStringList.IndexOf(const S: string): Integer;
begin
UpdateValueHash; //创建键值哈希表
if not CaseSensitive then
    Result := FValueHash.ValueOf(AnsiUpperCase(S))
else
    Result := FValueHash.ValueOf(S);
end;

function THashedStringList.IndexOfName(const Name: string): Integer;
begin
UpdateNameHash; //创建健名哈希表
if not CaseSensitive then
    Result := FNameHash.ValueOf(AnsiUpperCase(Name))
else
    Result := FNameHash.ValueOf(Name);
end;
    学过数据结构的朋友都知道,当数据量不是很大时,如几百、几千时哈希算法的优势并不是很明显,和普通的线性查找性能差不了多少,但是随着数据量在增大,其 性能的提升是相当可观的。所以建议各位程序员朋友,如果需要使用TStringList存储大数据量时,请使用THashedStringList代替。

分享到:
评论

相关推荐

    delphi-modbus-tcp-indy.7z

    这个"delphi-modbus-tcp-indy.7z"压缩包包含的是用Delphi编写的Modbus TCP组件,它基于两个不同的Indy版本——Indy 9和Indy 10。 Indy(Internet Direct)是Delphi和C++Builder中的一套网络库,提供了一组跨平台的...

    delphi-modbus-tcp三方控件,支持Delphi11

    标题中的"delphi-modbus-tcp三方控件,支持Delphi11"表明这是一个专为Delphi编程环境设计的第三方Modbus TCP库,用于在Delphi 11应用程序中实现Modbus通信。Modbus是一种广泛使用的工业通信协议,主要用于设备间的...

    Delphi-OpenCV-master delphi2010-XE8可用的OpenCV组件

    在使用"Delphi-OpenCV-master"时,用户需要按照作者提供的指南进行安装,这通常包括设置库路径、链接器选项等。对于初学者来说,这个过程可能会有些复杂,但一旦完成,就能在Delphi环境中直接调用OpenCV的API函数,...

    DELPHI 10.3编码转换 iso-8859-1转GBK,GBK转iso-8859-1

    在IT行业中,编码转换是一个常见的任务,特别是在处理不同字符集的文本数据时。本文将深入探讨标题提及的“DELPHI 10.3编码转换:iso-8859-1转GBK,GBK转iso-8859-1”,以及在二维码生成中的应用,以解决乱码问题。 ...

    DELPHI 学习--------水平渐变色

    在 DELPHI 开发环境中,水平渐变色是一种常见的视觉效果,常用于界面设计或图形编程。本项目“DELPHI 学习--------水平渐变色”旨在教授如何在 Delphi 中实现这种效果。通过分析提供的文件,我们可以推测这是一个...

    Delphi新手必看--Delphi精要

    2. **对象导向编程(OOP)**:Delphi是基于面向对象编程的,书中会详细解释类、对象、继承、多态、封装等概念,以及如何在Delphi中创建和使用自定义类。 3. **VCL框架**:Visual Component Library(VCL)是Delphi...

    Delphi7版本 - X-Superobject

    其高性能得益于 Delphi 的原生代码编译,使得处理大量 JSON 数据时仍能保持良好的性能。 总的来说,X-SuperObject 是 Delphi 7 开发者处理 JSON 的理想选择,它以其易用性和强大功能,极大地提升了 Delphi 7 应用...

    Delphi7 multipart/form-data实现上传文件

    在Delphi 7中,开发Web应用程序时,我们经常需要处理文件上传功能。"multipart/form-data" 是一种HTTP协议中的数据编码方式,主要用于在表单提交时上传文件,如图片或视频。本教程将深入讲解如何利用 Indy 10 库中的...

    Borland Delphi 6开发基础-面向对象

    - 属性提供对对象数据成员的封装访问,可以设置访问级别和类型转换。例如: ```delphi TMyClass = class private FValue: Integer; public property Value: Integer read FValue write FValue; end; ``` 8...

    DELPHI学习----摇号

    - **对象(Objects)**:在DELPHI中,一切皆为对象,每个组件都是一个对象,有其属性(Attributes)、方法(Methods)和事件(Events)。 - **VCL(Visual Component Library)**:DELPHI提供的大量可视组件库,...

    Delphi-Cross-Socket-master.zip

    "Delphi-Cross-Socket-master"中的项目可能包含了完整的客户端和服务端示例,通过查看源代码,我们可以学习如何配置Socket组件,如何编写事件处理代码,以及如何进行跨平台调试和测试。 总的来说,"Delphi-Cross-...

    delphi7-json-superobject

    在 Delphi 开发环境中,处理 JSON 数据是一项常见的任务。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读易写、机器易于解析和生成的特点,被广泛应用于网络通信和数据存储。在 Delphi 7 ...

    CEF4Delphi-master.zip_CEF4Delphi_chromium_delphi_delphi Chromium

    这个名为"CEF4Delphi-master.zip"的压缩包包含了CEF4Delphi的源代码、示例、库和其他必要的资源,便于开发者集成到自己的Delphi项目中。 Chromium是一款开源的浏览器项目,是Google Chrome的基础,以其高效、快速和...

    Delphi-控件实现NTP客户端校时功能

    Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-控件实现NTP客户端校时功能Delphi-...

    CSDN里面关于Delphi编程文档--很好很强大

    Delphi中的组件(Component)是其一大特色,文档会解释组件的概念,如何从工具箱拖放到表单上,以及如何通过属性、事件和方法来使用组件。常见的组件如Button、Label、Edit、ListBox、ComboBox等,都是开发者常用的...

    TMQTTClient-delphi.rar_MQTT delphi_TMQTTClient-delphi_delphi ssl

    标题中的"TMQTTClient-delphi.rar_MQTT delphi_TMQTTClient-delphi_delphi ssl"揭示了这个压缩包包含的是一个适用于Delphi开发环境的MQTT客户端库,名为TMQTTClient-delphi,特别强调了它支持SSL/TLS加密连接。...

    Delphi 开发实例 --Delphi 开发专家

    Delphi是一种强大的面向对象的编程环境,以其高效的编译器和直观的集成开发环境(IDE)而闻名。它基于Pascal语言,提供了丰富的类库,尤其是VCL(Visual Component Library),使得开发者能够快速构建Windows应用...

    delphi操作utf-8转码HTTPEncode

    在IT行业中,Delphi是一种基于Pascal语言的集成开发环境(IDE),用于创建Windows和Web应用程序。UTF-8是一种广泛使用的Unicode字符编码标准,而HTTPEncode是网络编程中用于处理URL、表单数据等字符串编码的一种方法...

    Delphi的开源项目-MyBean轻量级配置框架delphi-framework-MyBean-master.zip

    1. **导入框架**:将`delphi-framework-MyBean-master`文件夹解压后,将其中的源码文件导入到Delphi项目中,确保所有必要的单元被正确引用。 2. **编写Bean**:根据需求创建新的Bean类,继承自MyBean提供的基类,并...

Global site tag (gtag.js) - Google Analytics