起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 159|回复: 8

【搞定】[请求]想问一下X3平台有HashTable吗?**

[复制链接]
发表于 2007-4-26 15:52:02 | 显示全部楼层 |阅读模式
想问问各位,X3平台有没有类似Java 中的Hashtable 类的功能?能够象这样Put(Key, Value) 存放Key 和 Value ?谢谢!
回复

使用道具 举报

 楼主| 发表于 2007-4-26 16:07:54 | 显示全部楼层
我刚才在网上找到一个Delphi下的代码,但是我把它建在公共资源里的时候,编译不过去,改了之后还是编译不过去,问问高手这段代码我们能不能利用一下,在X3下为我们所用?
代码部分如下:
Hashtable.pas
--------------------------------------------------------------------------------
unit Hashtable;
   
    interface
   
    uses SysUtils, Classes;
   
    type
      { THashTable }
   
      PPHa****em = ^PHa****em;
      PHa****em = ^THa****em;
      THa****em = record
      Next: PHa****em;
      Key: string;
      Value: String;
      end;
   
      THashTable = class
      private
      Buckets: array of PHa****em;
      protected
      function Find(const Key: string): PPHa****em;
      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: PHa****em;
    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: PHa****em;
    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): PPHa****em;
    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: PHa****em;
    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: PHa****em;
      Prev: PPHa****em;
    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: PHa****em;
    begin
      P := Find(Key)^;
      if P <> nil then
      Result := P^.Value else
      Result := '';
    end;
   
    end.

本程序在Delphi 6.0下通过。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-26 16:10:15 | 显示全部楼层
不明白我贴上去的代码怎么都变成***号了,再来贴一遍:

unit Hashtable;
   
    interface
   
    uses SysUtils, Classes;
   
    type
      { THashTable }
   
      PPHa****em = ^PHa****em;
      PHa****em = ^THa****em;
      THa****em = record
      Next: PHa****em;
      Key: string;
      Value: String;
      end;
   
      THashTable = class
      private
      Buckets: array of PHa****em;
      protected
      function Find(const Key: string): PPHa****em;
      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: PHa****em;
    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: PHa****em;
    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): PPHa****em;
    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: PHa****em;
    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: PHa****em;
      Prev: PPHa****em;
    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: PHa****em;
    begin
      P := Find(Key)^;
      if P <> nil then
      Result := P^.Value else
      Result := '';
    end;
   
    end.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-26 16:11:58 | 显示全部楼层
不知道为啥,还是不行,****号部分是‘****’。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-26 16:13:46 | 显示全部楼层
就是贴不上去,是's' 'h' 'I' 't',这回总行了吧?
回复 支持 反对

使用道具 举报

发表于 2007-4-27 10:13:55 | 显示全部楼层
平台上不支持指针操作,所以以上代码肯定编译不过的,有两种方法解决
1  当作第三方控件导入平台使用
2 读懂以上程序,不要用指针和指针数组,用TList来代替,在平台上重写以上代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-27 11:07:17 | 显示全部楼层
好的,我试试吧,谢谢你了!
回复 支持 反对

使用道具 举报

发表于 2007-4-29 12:01:56 | 显示全部楼层
??
回复 支持 反对

使用道具 举报

发表于 2007-9-15 16:21:55 | 显示全部楼层
由于楼主长时间未跟贴,此帖先结,有问题请开新帖.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-16 12:33 , Processed in 0.038070 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表