zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    基数排序
    kt-Mapper 笔记
    归并排序
    快速排序
    第十一天——递归(五)
    第十天——闭包(一)
    第八天——函数的嵌套以及gloabal、nonlocal(三)(重点:执行过程)
    第八天——函数的作用域(二)
    第八天——函数的动态参数(一)
    第七天——函数的参数(二)
  • 原文地址:https://www.cnblogs.com/bjxsky/p/4619839.html
Copyright © 2011-2022 走看看