Delphi THashedStringList用法
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代替。
举例说明:
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- Button2: TButton;
- procedure Button1Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- uses
- IniFiles; //THashedStringList 来自 IniFiles 单元
- var
- Hash: THashedStringList;
- { THashedStringList 继承自 TStringList, 只是覆盖了 IndexOf、IndexOfName 两个方法以增加效率;
- 如果注重效率而不需要太多功能, 可以使用 TStringHash, 它是直接从 TObject 继承的数组链表 }
- //建立哈希表
- procedure TForm1.FormCreate(Sender: TObject);
- var
- i: Integer;
- begin
- Hash := THashedStringList.Create;
- for i := 97 to 122 do
- begin
- Hash.Add(Chr(i) + '=' + IntToStr(i));
- end;
- ShowMessage(Hash.Text);
- {
- 构建结果:
- a=97
- b=98
- c=99
- d=100
- e=101
- f=102
- g=103
- h=104
- i=105
- j=106
- k=107
- l=108
- m=109
- n=110
- o=111
- p=112
- q=113
- r=114
- s=115
- t=116
- u=117
- v=118
- w=119
- x=120
- y=121
- z=122
- }
- end;
- //检索哈希表
- procedure TForm1.Button1Click(Sender: TObject);
- var
- i: Integer;
- begin
- i := Hash.IndexOf('z=122');
- ShowMessage(IntToStr(i)); //25
- i := Hash.IndexOfName('z');
- ShowMessage(IntToStr(i)); //25
- end;
- //基本操作
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- Hash.Values['a'] := '65'; //赋值
- Hash.ValueFromIndex[0] := '65'; //用索引赋值
- ShowMessage(Hash.Values['z']); //122, 取值
- ShowMessage(Hash.ValueFromIndex[25]);//122, 用索引取值
- {其他操作参加 TStringList}
- end;
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- Hash.Free;
- end;
- end.
Delphi THashedStringList用法的更多相关文章
- (转载)delphi checklistbox用法
delphi checklistbox用法 在Delphi中checklistbox中高亮选中(不论是否Checked)能够进行操作么?删除,上下移动等等 删除:CheckListBox.Delete ...
- Delphi TStringHelper用法详解
Delphi TStringHelper用法详解 (2013-08-27 22:45:42) 转载▼ 标签: delphi_xe5 it 分类: Delphi Delphi XE4的TStringHe ...
- delphi TStringList 用法详解
转自: http://blog.163.com/you888@188/blog/static/67239619201472365642633/ delphi TStringList 用法详解 2014 ...
- delphi webbrowser用法集锦
delphi webbrowser用法集锦 (2012-05-13 08:29:00) 标签: it 分类: 软件_Software WebBrowser1.GoHome; //到浏览器默认主页 We ...
- delphi json用法
用法:uses Superobject, Sperjsondelphi里有json单元. procedure TForm2.SuperObjectClick(Sender: TObject); var ...
- Delphi - StringReplace用法
StringReplace用法 在开发过程中,有时候我们需要对字符串进行替换操作,屏蔽或者和谐某些字符,可使用Delphi自带的函数StringReplace函数. 通过代码进行说明: //函数原型 ...
- Delphi IDHTTP用法详解(六种用法)
一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入ID ...
- delphi checklistbox用法
在Delphi中checklistbox中高亮选中(不论是否Checked)能够进行操作么?删除,上下移动等等 删除:CheckListBox.DeleteSelected; 上下移: CheckLi ...
- Delphi IDHTTP用法详解
一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入 ...
随机推荐
- http/tcp/ip/端口
http是www服务器和本地浏览器之间传输超文本的协议. 每一台机器都有一个属于自己的ip地址,计算机也需要知道是哪个程序来接受信息,这里也就引入了端口号,可以简单地理解每一个程序都有一个唯一的端口号 ...
- leetcode-132-分割回文串②*
题目描述: 方法一:动态规划 class Solution: def minCut(self, s: str) -> int: min_s = list(range(len(s))) n = l ...
- 【归档】Mysql大表归档
作为一个企业或者DBA,我们通常会有这种想法,数据是一个公司的核心命脉,应该需要永久保存,很多时候DBA和开发沟通的时候,开发人员也会这么告诉我们,这份数据非常重要,数据需要永久保存.然而,如果将数据 ...
- php面向对象深入理解(二)
一个简单的小程序: 配置 config.ini <?php //项目的根目录 define("ROOT","F:/文件夹的名字/oop/"); //数 ...
- CF540D Bad Luck Island(期望dp)
传送门 解题思路 比较容易的一道期望\(dp\),设\(f[i][j][k]\)表示石头\(i\)个,剪刀\(j\)个,步子\(l\)个.然后转移的时候用组合数算一下就好了. 代码 #include& ...
- vmware压缩磁盘空间的方法, linux怎么卸载vmware
家里笔记本40G,可用空间怎么挤都只剩7G,从单位copy回来的linux虚拟机要10G,经检查实际使用空间5.7,也就是其他都是空余空间,可以释放掉.(只适合independent.Persiste ...
- LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)
题目标签:Binary Search 题目给了我们一组 int array,让我们找到数组的 peak. 利用 binary search, 如果数字比它后面那个数字小,说明还在上坡,缩小范围到右半边 ...
- Delphi 2010 中的泛型
Delphi 2010 中的泛型 2010已发布很长时间了,口碑还不错,准备用它开发下一项目,但对泛型等新东西的认识还不够,就搜了一下,发现下面这篇文章,还不错,大家一起补补课吧! C++中的模板.C ...
- HDU1501-Zipper-字符串的dfs
Given three strings, you are to determine whether the third string can be formed by combining the ch ...
- 剑指offer——25合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题解: 使用普通方法,或者递归,注意新的头节点即可. //使用普通的合并方法 class S ...