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

举例说明:

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