您的位置:程序门 -> delphi -> 语言基础/算法/系统设计



delphi 实现 hashtable


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


delphi 实现 hashtable[已结贴,结贴人:dr_lou]
发表于:2007-07-12 10:09:07 楼主
clientsocket不断接收string变量
我要从中解析出手机号和一种特殊信号,如果有就给这个手机号的记录+1
我想用hashtable

以前学java的   hashtable很好用   不知道delphi有没有类似的东西可用

hashtable
                            key                                   value
            手机号:13001370000       出现特殊信号次数:1              
            手机号:13001370001       出现特殊信号次数:3
            手机号:13001371000       出现特殊信号次数:5

要求key不能有重复值,可以快速通过key查找value,如果某一手机号第一次出现特殊信号就在hashtable里面添加该key/value    

发表于:2007-07-12 10:09:321楼 得分:0
不用hashtable能实现类似功能也行
发表于:2007-07-12 10:11:162楼 得分:10
hashtable.pas
--------------------------------------------------------------------------------
        unit   hashtable;
     
        interface
     
        uses   sysutils,   classes;
     
        type
            {   thashtable   }
     
            pphashitem   =   ^phashitem;
            phashitem   =   ^thashitem;
            thashitem   =   record
            next:   phashitem;
            key:   string;
            value:   string;
            end;
     
            thashtable   =   class
            private
            buckets:   array   of   phashitem;
            protected
            function   find(const   key:   string):   pphashitem;
            function   hashof(const   key:   string):   cardinal;   virtual;
            public
            constructor   create(size:   integer   =   256);
            destructor   destroy;   override;
            procedure   put(const   key:   string;   value:   string);
            procedure   clear;
            procedure   remove(const   key:   string);
            function   modify(const   key:   string;   value:   string):   boolean;
            function   get(const   key:   string):   string;
            end;
     
        implementation
     
        {   thashtable   }
     
        procedure   thashtable.put(const   key:   string;   value:   string);
        var
            hash:   integer;
            bucket:   phashitem;
        begin
            hash   :=   hashof(key)   mod   cardinal(length(buckets));
            new(bucket);
            bucket^.key   :=   key;
            bucket^.value   :=   value;
            bucket^.next   :=   buckets[hash];
            buckets[hash]   :=   bucket;
        end;
     
        procedure   thashtable.clear;
        var
            i:   integer;
            p,   n:   phashitem;
        begin
            for   i   :=   0   to   length(buckets)   -   1   do
            begin
            p   :=   buckets[i];
            while   p   <>   nil   do
            begin
                n   :=   p^.next;
                dispose(p);
                p   :=   n;
            end;
            buckets[i]   :=   nil;
            end;
        end;
     
        constructor   thashtable.create(size:   integer);
        begin
            inherited   create;
            setlength(buckets,   size);
        end;
     
        destructor   thashtable.destroy;
        begin
            clear;
            inherited;
        end;
     
        function   thashtable.find(const   key:   string):   pphashitem;
        var
            hash:   integer;
        begin
            hash   :=   hashof(key)   mod   cardinal(length(buckets));
            result   :=   @buckets[hash];
            while   result^   <>   nil   do
            begin
            if   result^.key   =   key   then
                exit
            else
                result   :=   @result^.next;
            end;
        end;
     
        function   thashtable.hashof(const   key:   string):   cardinal;
        var
            i:   integer;
        begin
            result   :=   0;
            for   i   :=   1   to   length(key)   do
            result   :=   ((result   shl   2)   or   (result   shr   (sizeof(result)   *   8   -   2)))   xor
                ord(key[i]);
        end;
     
        function   thashtable.modify(const   key:   string;   value:   string):   boolean;
        var
            p:   phashitem;
        begin
            p   :=   find(key)^;
            if   p   <>   nil   then
            begin
            result   :=   true;
            p^.value   :=   value;
            end
            else
            result   :=   false;
        end;
     
        procedure   thashtable.remove(const   key:   string);
        var
            p:   phashitem;
            prev:   pphashitem;
        begin
            prev   :=   find(key);
            p   :=   prev^;
            if   p   <>   nil   then
            begin
            prev^   :=   p^.next;
            dispose(p);
            end;
        end;
     
        function   thashtable.get(const   key:   string):   string;
        var
            p:   phashitem;
        begin
            p   :=   find(key)^;
            if   p   <>   nil   then
            result   :=   p^.value   else
            result   :=   ' ';
        end;
     
        end.
--------------------------------------------------------------------------------

使用起来就简单了:
hashtable   :=   thashtable.create();   //创建
hashtable.put(key,   value);               //赋值
value=hashtable.get(key);               //取值
hashtable.destroy;                       //撤消
发表于:2007-07-12 10:17:003楼 得分:0
大哥   我问问题之前能不baidu一下么

那个我试了   能插入重复的值
发表于:2007-07-12 10:18:444楼 得分:0
我会了   插入之前查找一下
发表于:2007-07-12 11:33:055楼 得分:10
楼主可以试试   dgl库

http://community.csdn.net/expert/topic/5604/5604520.xml?temp=.6217615
发表于:2007-07-13 10:38:516楼 得分:0
弱弱的问一句   哈西表怎么遍历?


快速检索

最新资讯
热门点击