在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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代替。 举例说明:
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代替。 举例说明:
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论