改良版TStringList类

2016-02-19 19:56 16 1 收藏

今天图老师小编给大家展示的是改良版TStringList类,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】

 

  

  {-----------------------------------------------------------------------------
  The contents of this file are subject to the Mozilla Public License Version
  1.1 (the "License"); you may not use this file except in compliance with the
  License. You may obtain a copy of the License at
  http://www.mozilla.org/NPL/NPL-1_1Final.html

  Software distributed under the License is distributed on an "AS IS" basis,
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  the specific language governing rights and limitations under the License.

  The Original Code is: mwStringHashList.pas, released December 18, 2000.

  The Initial Developer of the Original Code is Martin Waldenburg
  (Martin.Waldenburg@T-Online.de).
  Portions created by Martin Waldenburg are Copyright (C) 2000 Martin Waldenburg.
  All Rights Reserved.

  Contributor(s): ___________________.

  Last Modified: 18/12/2000
  Current Version: 1.1

  Notes: This is a very fast Hash list for strings.
         The TinyHash functions should be in most cases suffizient

  Known Issues:
  -----------------------------------------------------------------------------}

  unit mwStringHashList;

  interface

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  uses Classes, SysUtils;

  var
    mwHashTable: array[#0..#255] of Byte;
    mwInsensitiveHashTable: array[#0..#255] of Byte;

  type
    TmwStringHash = function (const aString: String): Integer;
    TmwStringHashCompare = function (const Str1: String; const Str2: String): Boolean;

    TmwHashWord = class
      S: String;
      constructor Create(aString: String);
    end;

    PHashPointerList = ^THashPointerList;
    THashPointerList = array[1..1] of Pointer;

    TmwBaseStringHashList = class(TObject)
      FList: PHashPointerList;
      fCapacity: Integer;
    protected
      function Get(Index: Integer): Pointer;
      procedure Put(Index: Integer; Item: Pointer);
      procedure SetCapacity(NewCapacity: Integer);
    public
      destructor Destroy; override;
      property Capacity: Integer read fCapacity;
      property Items[Index: Integer]: Pointer read Get write Put; default;
    end;

    TmwHashStrings = class(TList)
    public
      destructor Destroy; override;
      procedure AddString(S: String);
    end;

    TmwHashItems = class(TmwBaseStringHashList)
    public
      procedure AddString(S: String);
    end;

    TmwStringHashList = class(TmwBaseStringHashList)
    private
      fHash: TmwStringHash;
      fCompare: TmwStringHashCompare;
    public
      constructor Create(aHash: TmwStringHash; aCompare: TmwStringHashCompare);
      procedure AddString(S: String);
      function Hash(S: String): Boolean;
      function HashEX(S: String; HashValue: Integer): Boolean;
    end;

    function SimpleHash(const aString: String): Integer;
    function ISimpleHash(const aString: String): Integer;
    function TinyHash(const aString: String): Integer;
    function ITinyHash(const aString: String): Integer;
    function HashCompare(const Str1: String; const Str2: String): Boolean;
    function IHashCompare(const Str1: String; const Str2: String): Boolean;

  implementation

  procedure InitTables;
  var
    I: Char;
  begin
    for I:= #0 to #255 do
    begin
      mwHashTable[I]:= Ord(I);
      mwInsensitiveHashTable[I]:= Ord(UpperCase(String(I))[1]);
    end;
  end;

  function SimpleHash(const aString: String): Integer;
  var
    I: Integer;
  begin
    Result:= Length(aString);
    for I:= 1 to Length(aString) do
    inc(Result, mwHashTable[aString[I]]);
  end;

  function ISimpleHash(const aString: String): Integer;
  var
    I: Integer;
  begin
    Result:= Length(aString);
    for I:= 1 to Length(aString) do
    inc(Result, mwInsensitiveHashTable[aString[I]]);
  end;

  function TinyHash(const aString: String): Integer;
  var
    I: Integer;
  begin
    Result:= Length(aString);
    for I:= 1 to Length(aString) do
    begin
      inc(Result, mwHashTable[aString[I]]);
      if I = 2 then Break;
    end;
  end;

  function ITinyHash(const aString: String): Integer;
  var
    I: Integer;
  begin
    Result:= Length(aString);
    for I:= 1 to Length(aString) do
    begin
      inc(Result, mwInsensitiveHashTable[aString[I]]);
      if I = 2 then Break;
    end;
  end;

  function HashCompare(const Str1: String; const Str2: String): Boolean;
  var
    I: Integer;
  begin
    if Length(Str1) Length(Str2) then
    begin
      Result:= False;
      Exit;
    end;
    Result:= True;
    for I:= 1 to Length(Str1) do
    if Str1[I] Str2[I] then
    begin
      Result:= False;
      Exit;
    end;
  end;

  function IHashCompare(const Str1: String; const Str2: String): Boolean;
  var
    I: Integer;
  begin
    if Length(Str1) Length(Str2) then
    begin
      Result:= False;
      Exit;
    end;
    Result:= True;
    for I:= 1 to Length(Str1) do
    if mwInsensitiveHashTable[Str1[I]] mwInsensitiveHashTable[Str2[I]] then
    begin
      Result:= False;
      Exit;
    end;
  end;

  { TmwHashString }

  constructor TmwHashWord.Create(aString: String);
  begin
    inherited Create;
    S:= aString;
  end;

  { TmwBaseStringHashList }

  destructor TmwBaseStringHashList.Destroy;
  var
    I: Integer;
  begin
    for I:= 1 to fCapacity do
      if Items[I] nil then TObject(Items[I]).Free;
      ReallocMem(FList, 0);
    inherited Destroy;
  end;

  function TmwBaseStringHashList.Get(Index: Integer): Pointer;
  begin
    Result:= nil;
    if (Index 0) and (Index = fCapacity) then
    Result:= fList[Index];
  end;

  procedure TmwBaseStringHashList.Put(Index: Integer; Item: Pointer);
  begin
    if (Index 0) and (Index = fCapacity) then
    fList[Index]:= Item;
  end;

  procedure TmwBaseStringHashList.SetCapacity(NewCapacity: Integer);
  var
    I, OldCapacity: Integer;
  begin
    if NewCapacity fCapacity then
    begin
      ReallocMem(FList, (NewCapacity) * SizeOf(Pointer));
      OldCapacity:= fCapacity;
      FCapacity := NewCapacity;
      for I:= OldCapacity+1 to NewCapacity do Items[I]:= nil;
    end;
  end;

  { TmwHashStrings }

  procedure TmwHashStrings.AddString(S: String);
  begin
    Add(TmwHashWord.Create(S));
  end;

  destructor TmwHashStrings.Destroy;
  var
    I: Integer;
  begin
    for I:= 0 to Count - 1 do
    if Items[I] nil then TObject(Items[I]).Free;
    inherited Destroy;
  end;

  { TmwHashItems }

  procedure TmwHashItems.AddString(S: String);
  var
    HashWord: TmwHashWord;
    HashStrings: TmwHashStrings;
  begin
    SetCapacity(Length(S));
    if Items[Length(S)] = nil then
    begin
      Items[Length(S)]:= TmwHashWord.Create(S);
    end else
    if TObject(Items[Length(S)]) is TmwHashStrings then
    begin
      TmwHashStrings(Items[Length(S)]).AddString(S);
    end else
    begin
      HashWord:= Items[Length(S)];
      HashStrings:= TmwHashStrings.Create;
      Items[Length(S)]:= HashStrings;
      HashStrings.AddString(HashWord.S);
      HashWord.Free;
      HashStrings.AddString(S)
    end;
  end;

  { TmwStringHashList }

  constructor TmwStringHashList.Create(aHash: TmwStringHash; aCompare: TmwStringHashCompare);
  begin
    inherited Create;
    fHash:= aHash;
    fCompare:= aCompare;
  end;

  procedure TmwStringHashList.AddString(S: String);
  var
    HashWord: TmwHashWord;
    HashValue: Integer;
    HashItems: TmwHashItems;
  begin
    HashValue:= fHash(S);
    if HashEx(S, HashValue) then exit;
    if HashValue = fCapacity then SetCapacity(HashValue);
    if Items[HashValue] = nil then
    begin
      Items[HashValue]:= TmwHashWord.Create(S);
    end else
    if TObject(Items[HashValue]) is TmwHashItems then
    begin
      TmwHashItems(Items[HashValue]).AddString(S);
    end else
    begin
      HashWord:= Items[HashValue];
      HashItems:= TmwHashItems.Create;
      Items[HashValue]:= HashItems;
      HashItems.AddString(HashWord.S);
      HashWord.Free;
      HashItems.AddString(S);
    end;
  end;

  function TmwStringHashList.Hash(S: String): Boolean;
  begin
    Result:= HashEX(S, fHash(S));
  end;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  function TmwStringHashList.HashEX(S: String; HashValue: Integer): Boolean;
  var
    Temp: TObject;
    Hashword: TmwHashWord;
    HashItems: TmwHashItems;
    I: Integer;
  begin
    Result:= False;
    if HashValue 1 then Exit;
    if HashValue Capacity  then Exit;
    if Items[HashValue] nil then
    begin
      if TObject(Items[HashValue]) is TmwHashWord then
      begin
        Result:= fCompare(TmwHashWord(Items[HashValue]).S, S);
      end else
      begin
        HashItems:= Items[HashValue];
        if Length(S) HashItems.Capacity  then Exit;
        Temp:= HashItems[Length(S)];
        if Temp nil then
        if Temp is TmwHashWord then
        begin
          Result:= fCompare(TmwHashWord(Temp).S, S);
        end else
        for I:= 0 to TmwHashStrings(Temp).Count -1 do
        begin
          HashWord:= TmwHashStrings(Temp)[I];
          Result:= fCompare(HashWord.S, S);
          if Result then exit;
        end;
      end;
    end;
  end;

  Initialization
  InitTables;
  end. 

来源:http://www.tulaoshi.com/n/20160219/1622334.html

延伸阅读
标签: 美容
瘦腹减肥动作一、抬腿紧缩腹部 难度:★ 次数:初次接触可以以10个仰卧起坐为1套,每次做3套的频率来完成。当慢慢熟悉掌握动作,也打下一定的运动基础后,则可以增加至20个仰卧起坐为1套,重复3套动作哦! 1.躺卧在地上,双手抱头,手肘弯曲并往上抬起,左右手臂尽量互相平行,注意不要大幅度地打开,也不要相靠。 ...
能否优生优育男人是关键(1) 一个生命的诞生是从什么时候开始的?让我们用一个简单的流程图表示一下新生命的诞生过程。 父体→下丘脑—垂体—睾丸轴,生殖内分泌系统调控→精原母细胞→数次有丝分裂、增殖、更新、分化→初级精母细胞→两次成熟分裂 →次级精母细胞→分化→精子细胞→ 高尔基期...
标签: 孕妇食谱
传统鸡蛋羹4种改良吃法 传统的鸡蛋羹就是纯粹的蒸鸡蛋,宝宝经常吃就不爱吃了。所以,就往鸡蛋里加些辅料,即改变了辅食的花样,也给宝宝增加了营养。 功效:补中壮筋骨,增加钙,磷及维生素D,预防小儿佝偻病。 材料:虾皮10克,鸡蛋1个。 做法:将鸡蛋放碗里,打散加少量温开水,食盐,与虾皮...
标签: windows 操作系统
  Windows XP中,很多软件的打开或保存窗口左侧都有几个系统自定的文件夹。有没有办法把它们换成我们常用的文件夹呢?当然,利用组策略就可以改良自己的打开窗口了。 单击“开始→运行”,输入gpedit.msc,打开“组策略”编辑器窗口。选择“用户配置→管理模板→Windows组件→Windows资源管理器→通用打开文件对话框”,双击右...
/*  FTPFactory.cs  Better view with tab space=4  Written by Jaimon Mathew (jaimonmathew@rediffmail.com)  Rolander,Dan (Dan.Rolander@marriott.com) has modified the  download  method to cope with file ...

经验教程

971

收藏

23
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部