【转】Delphi 中 Hash 表操作,THashedStringlist类的简单使用

TStringList是我们常用的字符串列表类型,用法就不在这里赘述,但是,在其数据项数增多时,其搜索(主要是name/key搜索和indexof搜索)性能会急剧下降,原因是TStringList的内部存储使用了链表形式,而搜索操作使用了循环遍历方式。

值得高兴的是,在iniFiles单元,Delphi为我们提供了THashedStringList类型,即,经过哈希处理的TStringList,它继承自TStringList,只是对搜索方法进行了优化,因此,我们完全可以放心的在大量字符串搜索的时候使用它来代替TStringList,而需要改变的只是在:=的后面用THashedStringList.create来代替TStringList.create,但其速度却提高了一个数量级。

在Delphi中有一个THashedStringlist类,使用这个类可以实现Hash表的操作.使用这个类需要引用IniFiles头文件.

例如:我们定义的数据结构是:

 

复制代码
RTest = record
Key:Integer;
Name:String[
20];
Sex:Boolean;
Age:Integer;
end;
PTest
= ^RTest ;
复制代码

1:创建Hash表.
ScHash:=THashedStringlist.Create;

2:将数据结构加入Hash表中.
复制代码
var
Index:Integer;
p_Test:PTest;
Index:
=ScHash.IndexOf(IntToStr(p_Test.Key));
if Index=-1 then
begin
ScHash.AddObject(IntToStr(p_Test.Key),TObject(Integer(p_Test)));
end;
复制代码

 

在加入Hash表的时候,首先我们检查看这个Key是否在Hash表中,如果Index=-1则说明此Key不在Hash表中,则我们将这个结构指针加入到Hash表中.


将数据结构从Hash表中删除.

 

复制代码
var
Index:Integer;
t_Object: TObject;
Index:
=ScHash.IndexOf(IntToStr(p_Test.Key));
if Index<>-1 then
begin
t_Object:
=ScHash.Objects[Index];
ScHash.Delete(Index);
end;
复制代码

 


删除Hash表

在删除Hash表的时候和一般的Tlist删除一样,使用Free.

 

ScHash.Free;

 

posted @ 2020-02-18 16:54  九日之阳  阅读(428)  评论(0编辑  收藏  举报