Delphi THashedStringList用法

來源:互聯網
上載者:User

標籤:

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. } 
  81. end; 
  82.  
  83. //檢索雜湊表 
  84. procedure TForm1.Button1Click(Sender: TObject); 
  85. var 
  86.   i: Integer; 
  87. begin 
  88.   i := Hash.IndexOf(‘z=122‘); 
  89.   ShowMessage(IntToStr(i));  //25 
  90.  
  91.   i := Hash.IndexOfName(‘z‘); 
  92.   ShowMessage(IntToStr(i));  //25 
  93. end; 
  94.  
  95. //基本操作 
  96. procedure TForm1.Button2Click(Sender: TObject); 
  97. begin 
  98.   Hash.Values[‘a‘] := ‘65‘;       //賦值 
  99.   Hash.ValueFromIndex[0] := ‘65‘; //用索引賦值 
  100.  
  101.   ShowMessage(Hash.Values[‘z‘]);       //122, 取值 
  102.   ShowMessage(Hash.ValueFromIndex[25]);//122, 用索引取值 
  103.  
  104.   {其他動作參加 TStringList} 
  105. end; 
  106.  
  107. procedure TForm1.FormDestroy(Sender: TObject); 
  108. begin 
  109.   Hash.Free; 
  110. end; 
  111.  
  112. end.

Delphi THashedStringList用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.