Delphi XE7 随笔(2)- 字典

只说大家平时关注得比较少的

var
  mm: TDictionary<string, TObject>;
  acompare: IEqualityComparer<string>;
  pp:TPair<string,TObject>;
begin
    acompare := TEqualityComparer<string>.Construct(
        function(const Left, Right: string):Boolean
        begin
            result := UpperCase(Left) = UpperCase(Right);
        end,
        function(const Value:string):Integer
        begin
            Result:=Length(Value);
        end);
    mm:=TDictionary<string, TObject>.Create(acompare);
    mm.Add('abc',TObject(PChar('中国')));
    mm.AddOrSetValue('Abc',TObject(PChar('beijing')));
    for pp in mm do
        ShowMessage(pp.Key+':'+PChar(pp.Value));
end;

上面的代码中,有一个比较类TEqualityComparer,用来判断新加的一组key.value中的key是不是存在。

Construct中的第一个函数就不说了,说第二个函数,这个函数大家可能都只是照着用,但是不清楚为什么这么用。

帮助文档中是这么说的:Generate a hash code. Simply return the length of the string as its hash code.

字典是以hash表的方式存储数据的,有了hash值,可以更快地定位所要的数据,以上面的代码为例,其hash存储的格式应该是这样的:

1  a:value  b:value  c:value

2  aa:value  bb:value  cc:value

....

其中a,b,c,aa,bb,cc就是key,而前面的1、2则是hash值,用length生成,如length(a) = 1,length(aa) = 2 , length(ab) = 2....

通过key的hash值,能快速定位到1、2...,然后再找到对应的key和value。

 

posted @ 2017-02-25 21:10  rockmmm  阅读(1017)  评论(0编辑  收藏  举报