Delphi中的THashedStringList对象

Delphi在在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;

从中可以看出T HashedStringList类继承自TStringList,所以保留了TStringList的方法,但TStringList类是使用数组以线性方式保存所有子项的,所以无论使用其IndexOf方法还是IndexOfName方法都是使用线性查找法,这种查寻方法当数据量比较大时其查询是非常低。

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代替。

举例说明:

  1. unit Unit1;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls;
  6. type
  7. TForm1 = class(TForm)
  8. Button1: TButton;
  9. Button2: TButton;
  10. procedure Button1Click(Sender: TObject);
  11. procedure FormCreate(Sender: TObject);
  12. procedure FormDestroy(Sender: TObject);
  13. procedure Button2Click(Sender: TObject);
  14. private
  15. { Private declarations }
  16. public
  17. { Public declarations }
  18. end;
  19. var
  20. Form1: TForm1;
  21. implementation
  22. {$R *.dfm}
  23. uses
  24. IniFiles;  //THashedStringList 来自 IniFiles 单元
  25. var
  26. Hash: THashedStringList;
  27. { THashedStringList 继承自 TStringList, 只是覆盖了 IndexOf、IndexOfName 两个方法以增加效率;
  28. 如果注重效率而不需要太多功能, 可以使用 TStringHash, 它是直接从 TObject 继承的数组链表 }
  29. //建立哈希表
  30. procedure TForm1.FormCreate(Sender: TObject);
  31. var
  32. i: Integer;
  33. begin
  34. Hash := THashedStringList.Create;
  35. for i := 97 to 122 do
  36. begin
  37. Hash.Add(Chr(i) + '=' + IntToStr(i));
  38. end;
  39. ShowMessage(Hash.Text);
  40. {
  41. 构建结果:
  42. a=97
  43. b=98
  44. c=99
  45. d=100
  46. e=101
  47. f=102
  48. g=103
  49. h=104
  50. i=105
  51. j=106
  52. k=107
  53. l=108
  54. m=109
  55. n=110
  56. o=111
  57. p=112
  58. q=113
  59. r=114
  60. s=115
  61. t=116
  62. u=117
  63. v=118
  64. w=119
  65. x=120
  66. y=121
  67. z=122
  68. }
  69. end;
  70. //检索哈希表
  71. procedure TForm1.Button1Click(Sender: TObject);
  72. var
  73. i: Integer;
  74. begin
  75. i := Hash.IndexOf('z=122');
  76. ShowMessage(IntToStr(i));  //25
  77. i := Hash.IndexOfName('z');
  78. ShowMessage(IntToStr(i));  //25
  79. end;
  80. //基本操作
  81. procedure TForm1.Button2Click(Sender: TObject);
  82. begin
  83. Hash.Values['a'] := '65';       //赋值
  84. Hash.ValueFromIndex[0] := '65'; //用索引赋值
  85. ShowMessage(Hash.Values['z']);       //122, 取值
  86. ShowMessage(Hash.ValueFromIndex[25]);//122, 用索引取值
  87. {其他操作参加 TStringList}
  88. end;
  89. procedure TForm1.FormDestroy(Sender: TObject);
  90. begin
  91. Hash.Free;
  92. end;
  93. end.

Delphi THashedStringList用法的更多相关文章

  1. (转载)delphi checklistbox用法

    delphi checklistbox用法 在Delphi中checklistbox中高亮选中(不论是否Checked)能够进行操作么?删除,上下移动等等 删除:CheckListBox.Delete ...

  2. Delphi TStringHelper用法详解

    Delphi TStringHelper用法详解 (2013-08-27 22:45:42) 转载▼ 标签: delphi_xe5 it 分类: Delphi Delphi XE4的TStringHe ...

  3. delphi TStringList 用法详解

    转自: http://blog.163.com/you888@188/blog/static/67239619201472365642633/ delphi TStringList 用法详解 2014 ...

  4. delphi webbrowser用法集锦

    delphi webbrowser用法集锦 (2012-05-13 08:29:00) 标签: it 分类: 软件_Software WebBrowser1.GoHome; //到浏览器默认主页 We ...

  5. delphi json用法

    用法:uses Superobject, Sperjsondelphi里有json单元. procedure TForm2.SuperObjectClick(Sender: TObject); var ...

  6. Delphi - StringReplace用法

    StringReplace用法 在开发过程中,有时候我们需要对字符串进行替换操作,屏蔽或者和谐某些字符,可使用Delphi自带的函数StringReplace函数. 通过代码进行说明: //函数原型 ...

  7. Delphi IDHTTP用法详解(六种用法)

    一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入ID ...

  8. delphi checklistbox用法

    在Delphi中checklistbox中高亮选中(不论是否Checked)能够进行操作么?删除,上下移动等等 删除:CheckListBox.DeleteSelected; 上下移: CheckLi ...

  9. Delphi IDHTTP用法详解

    一.IDHTTP的基本用法  IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等  IDHttp的创建,需要引入 ...

随机推荐

  1. 1.Struts2快速入门

    Struts2是一个基于MVC设计模式的Web层框架 Web层框架的特点:前端控制器模式 快速入门 1.下载Struts2的框架包 https://struts.apache.org/ 2.导入jar ...

  2. BCZM: Chapter 1

    1.1 CPU 占用率 https://www.cnblogs.com/TenosDoIt/p/3242910.html 1.2 中国象棋将帅 https://blog.csdn.net/kabini ...

  3. H5新增的postMessage跨域解决方案Demo

    Demo背景:html中使用iframe嵌入了跨域的vue项目,在html中将参数传入到跨越的vue项目中. 向跨越的子窗口中发送数据 function sendMessage(data) { // ...

  4. 记录下工作中用到的Linux命令

    ---恢复内容开始--- 常用的Linux命令以下命令在博主的开发中经常使用,因此在此做一记录,以做备忘! 1.查看java进程ps -ef|grep javaps aux|grep java lso ...

  5. hive的数据压缩

    hive的数据压缩 在实际工作当中,hive当中处理的数据,一般都需要经过压缩,前期我们在学习hadoop的时候,已经配置过hadoop的压缩,我们这里的hive也是一样的可以使用压缩来节省我们的MR ...

  6. NX二次开发-UFUN重命名图纸页UF_DRAW_rename_drawing

    #include <uf.h> #include <uf_draw.h> #include <uf_drf.h> #include <uf_obj.h> ...

  7. vue webpack打包后.css文件里面的背景图片路径错误解决方法

    资源相对引用路径 问题描述 一般情况下,通过webpack+vuecli默认打包的css.js等资源,路径都是绝对的. 但当部署到带有文件夹的项目中,这种绝对路径就会出现问题,因为把配置的static ...

  8. Linux命令(2):cat

    cat命令是一个文本连接和查看的命令,用于文件的输出显示. 三大功能 一次显示整个文件. $ cat filename 从键盘创建一个文件.只能创建新文件,不能编辑已有文件. $ cat > f ...

  9. hdu多校第九场 1002 (hdu6681) Rikka with Cake 树状数组维护区间和/离散化

    题意: 在一块长方形蛋糕上切若干刀,每一刀都是从长方形某条边开始,垂直于这条边,但不切到对边,求把长方形切成了多少块. 题解: 块数=交点数+1 因为对于每个交点,唯一且不重复地对应着一块蛋糕. 就是 ...

  10. MySql 5.6重新安装后忘记密码的解决办法

    1.先使用管理员权限的cmd停止MySQL服务:net stop mysql 2.重新打开一个cmd窗口进入安装目录的bin路径后输入mysqld --skip-grant-tables,注意这个cm ...