哈希 + LIST简单应用(DELPHI)

 

ContractedBlock.gif ExpandedBlockStart.gif Code
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles, StdCtrls;

type
  PIpRecRord 
= ^TIpRecRord;
  TIpRecRord 
= packed record
    IP1: 
string;
    Ip2: Pointer;
    Count: Integer;
  
end;

  THashIp 
= class(TObject)
    
private
     FStringHash: TStringHash;
     Flist: TList;
    
public
      
constructor Create(AMax: Integer = 250);
      
destructor Destroy;
      
procedure AddIp(const Ip: string);
      
function GetIpNum(const I: Integer): Integer;

  
end;
  TForm1 
= class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Button2: TButton;
    
procedure FormCreate(Sender: TObject);
    
procedure Button1Click(Sender: TObject);
    
procedure Button2Click(Sender: TObject);
    
procedure FormClose(Sender: TObject; var Action: TCloseAction);
  
private
    
{ Private declarations }
  
public
    
{ Public declarations }
  
end;

var
  Form1: TForm1;
  Test: THashIp;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Test :
= THashIp.Create();
end;

{ THashIp }

procedure THashIp.AddIp(const Ip: string);
var
  P1: PIpRecRord;
begin
  
if Length(Ip) = 0 then Exit;
  
if FStringHash.ValueOf(Ip) = -1 then
  
begin
    New(P1);
    P1.IP1 :
= Ip;
    P1.Count :
= 1;
    FStringHash.Add(P1.IP1, Flist.Count);
    Flist.Add(P1);
  
end
  
else
    PIpRecRord(Flist[FStringHash.ValueOf(iP)]).Count :
= PIpRecRord(Flist[FStringHash.ValueOf(iP)]).Count + 1;
end;

constructor THashIp.Create(AMax: Integer);
begin
  FStringHash :
= TStringHash.Create(AMax);
  Flist :
= TList.Create;
end;

destructor THashIp.Destroy;
begin
  
if Flist.Count > 0 then
  
begin
    
while Assigned(Flist[0]) do
    
begin
      Dispose(Flist[
0]);
      Flist.Delete(
0);
    
end;
  
end;

  FStringHash.Free;
end;

function THashIp.GetIpNum(const I: Integer): Integer;
var
  Index: Integer;
begin
  Result :
= 0;
  
for Index := 0 to Flist.Count - 1 do
  
begin
    
if PIpRecRord(Flist[Index])^.Count = I then
      Inc(Result);
  
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I, Data: Integer;
begin
  
for I := 0 to 20 do
  
begin
    Data :
= Random(20);
    Test.AddIp(IntToStr(Data));
    Memo1.Lines.Add(IntToStr(Data));
  
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  I, Data: Integer;
begin
  
for I := 0 to 8 do
    Memo2.Lines.Add(IntToStr(Test.GetIpNum(I)));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Test.Free;
end;

end.

 

转载于:https://www.cnblogs.com/chengxin1982/archive/2009/11/01/1593863.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值