五、Delphi 2009 泛型容器单元(Generics.Collections): TDictionary<T>

本文详细介绍了如何在Delphi中使用TDictionary泛型容器进行键值对存储与检索操作,包括添加、删除、尝试取值及清空等方法,并提供了完整的示例代码。

TDictionary 类似哈希表.

 

ContractedBlock.gifExpandedBlockStart.gifpas
unit Unit1;

interface

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

type
  TForm1 
= class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    
procedure FormCreate(Sender: TObject);
    
procedure FormDestroy(Sender: TObject);
    
procedure Button1Click(Sender: TObject);
    
procedure Button2Click(Sender: TObject);
    
procedure Button3Click(Sender: TObject);
    
procedure Button4Click(Sender: TObject);
  
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Generics.Collections; {Delphi 2009 新增的泛型容器单元}

var
  Dictionary: TDictionary
<Cardinal,string>;  
  
{定义一个泛型 TDictionary 类, 指定有 Cardinal、string 构成}

{建立}
procedure TForm1.FormCreate(Sender: TObject);
begin
  Dictionary :
= TDictionary<Cardinal,string>.Create;

  Memo1.Clear;
  Button1.Caption :
= Button1.Caption + ' 添加';
  Button2.Caption :
= Button2.Caption + ' 删除';
  Button3.Caption :
= Button3.Caption + ' 尝试取值';
  Button4.Caption :
= Button4.Caption + ' 清空';

  Edit1.Clear;
  Edit2.Clear;
  Edit1.NumbersOnly :
= True;
end;

{释放}
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Dictionary.Free;
end;

{添加}
procedure TForm1.Button1Click(Sender: TObject);
var
  key: Cardinal;
  value: 
string;
  str: 
string;
  k,v: Boolean;
begin
  key :
= StrToIntDef(Edit1.Text, 0);
  value :
= Edit2.Text;
  
if value = '' then value := 'Null';

  k :
= Dictionary.ContainsKey(key);     {Key 是否存在}
  v :
= Dictionary.ContainsValue(value); {Value 是否存在}
  
  
if not k then
  
begin
    Dictionary.Add(key, value);
    Memo1.Lines.Add(Format(
'%d=%s', [key, value])); {同步显示}
  
end;

  
if k and not v then
  
begin
    str :
= Format('key 已存在: %d=%s; 是否修改其值?', [key, Dictionary[key]]);
    
if MessageBox(0, PChar(str), '提示', MB_OKCANCEL or MB_ICONQUESTION) = mrOk then
    
begin
      
//Dictionary[key] := value; {Dictionary[key] = Dictionary.Item[key]}
      Dictionary.AddOrSetValue(key, value);       
{也可使用上一句}
      Memo1.Lines.Values[IntToStr(key)] :
= value; {同步显示}
    
end;
  
end;

  
if k and v then
  
begin
    str :
= Format('%d=%s 已存在, 不能重复添加', [key, value]);
    MessageBox(
0, PChar(str), '错误', MB_OK + MB_ICONHAND);
  
end;

  Text :
= IntToStr(Dictionary.Count);
end;

{删除: Remove}
procedure TForm1.Button2Click(Sender: TObject);
var
  key: Integer;
  i: Integer;
begin
  key :
= StrToIntDef(Edit1.Text, 0);

  
if not Dictionary.ContainsKey(key) then  
  
begin
    ShowMessageFmt(
'key: %d 不存在', [key]);
    Exit;
  
end;
    
  Dictionary.Remove(key);
  Text :
= IntToStr(Dictionary.Count);
  
  
{同步显示}
  i :
= Memo1.Lines.IndexOfName(IntToStr(key));
  
if i > -1 then Memo1.Lines.Delete(i);
end;

{尝试取值: TryGetValue}
procedure TForm1.Button3Click(Sender: TObject);
var
  key: Integer;
  value: 
string;
begin
  key :
= StrToIntDef(Edit1.Text, 0);
  
if Dictionary.TryGetValue(key, value) then
    ShowMessageFmt(
'key: %d 已存在, 其值是: %s', [key, value])
  
else
    ShowMessageFmt(
'key: %d 不存在', [key])
end;

{清空: Clear}
procedure TForm1.Button4Click(Sender: TObject);
begin
  Dictionary.Clear;
  Text :
= IntToStr(Dictionary.Count);
  Memo1.Clear; 
{同步显示}
end;

end.

 

ContractedBlock.gifExpandedBlockStart.gifdfm
object Form1: TForm1
  Left 
= 0
  Top 
= 0
  Caption 
= 'Form1'
  ClientHeight 
= 165
  ClientWidth 
= 275
  Color 
= clBtnFace
  Font.Charset 
= DEFAULT_CHARSET
  Font.Color 
= clWindowText
  Font.Height 
= -11
  Font.Name 
= 'Tahoma'
  Font.Style 
= []
  OldCreateOrder 
= False
  Position 
= poDesktopCenter
  OnCreate 
= FormCreate
  OnDestroy 
= FormDestroy
  PixelsPerInch 
= 96
  TextHeight 
= 13
  
object Memo1: TMemo
    Left 
= 0
    Top 
= 0
    Width 
= 133
    Height 
= 165
    Align 
= alLeft
    Font.Charset 
= DEFAULT_CHARSET
    Font.Color 
= clWindowText
    Font.Height 
= -13
    Font.Name 
= 'Courier New'
    Font.Style 
= []
    Lines.Strings 
= (
      
'Memo1')
    ParentFont 
= False
    ScrollBars 
= ssBoth
    TabOrder 
= 0
    ExplicitHeight 
= 176
  
end
  
object Button1: TButton
    Left 
= 139
    Top 
= 40
    Width 
= 128
    Height 
= 25
    Caption 
= 'Button1'
    TabOrder 
= 1
    OnClick 
= Button1Click
  
end
  
object Button2: TButton
    Left 
= 139
    Top 
= 71
    Width 
= 128
    Height 
= 25
    Caption 
= 'Button2'
    TabOrder 
= 2
    OnClick 
= Button2Click
  
end
  
object Button3: TButton
    Left 
= 139
    Top 
= 102
    Width 
= 128
    Height 
= 25
    Caption 
= 'Button3'
    TabOrder 
= 3
    OnClick 
= Button3Click
  
end
  
object Edit1: TEdit
    Left 
= 139
    Top 
= 8
    Width 
= 40
    Height 
= 21
    TabOrder 
= 4
    Text 
= 'Edit1'
  
end
  
object Edit2: TEdit
    Left 
= 185
    Top 
= 8
    Width 
= 81
    Height 
= 21
    TabOrder 
= 5
    Text 
= 'Edit2'
  
end
  
object Button4: TButton
    Left 
= 139
    Top 
= 133
    Width 
= 128
    Height 
= 25
    Caption 
= 'Button4'
    TabOrder 
= 6
    OnClick 
= Button4Click
  
end
end

转载于:https://www.cnblogs.com/jxgxy/archive/2009/11/03/1595106.html

Exception in thread "main" java.lang.StackOverflowError at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:287) at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283) at sun.reflect.generics.parser.SignatureParser.parseTypeArgument(SignatureParser.java:436) at sun.reflect.generics.parser.SignatureParser.parseTypeArguments(SignatureParser.java:396) at sun.reflect.generics.parser.SignatureParser.parsePackageNameAndSimpleClassTypeSignature(SignatureParser.java:346) at sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:310) at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:289) at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283) at sun.reflect.generics.parser.SignatureParser.parseTypeArgument(SignatureParser.java:436) at sun.reflect.generics.parser.SignatureParser.parseTypeArguments(SignatureParser.java:396) at sun.reflect.generics.parser.SignatureParser.parsePackageNameAndSimpleClassTypeSignature(SignatureParser.java:346) at sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:310) at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:289) at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283) at sun.reflect.generics.parser.SignatureParser.parseTypeSignature(SignatureParser.java:485) at sun.reflect.generics.parser.SignatureParser.parseArrayTypeSignature(SignatureParser.java:464) at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:294) at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283) at sun.reflect.generics.parser.SignatureParser.parseTypeSignature(SignatureParser.java:485) at sun.reflect.generics.parser.SignatureParser.parseReturnType(SignatureParser.java:627) at sun.reflect.generics.parser.SignatureParser.parseMethodTypeSignature(SignatureParser.java:577) at sun.reflect.generics.parser.SignatureParser.parseMethodSig(SignatureParser.java:171) at sun.reflect.generics.repository.ConstructorRepository.parse(ConstructorRepository.java:55) at sun.reflect.generics.repository.ConstructorRepository.parse(ConstructorRepository.java:43) at sun.reflect.generics.repository.AbstractRepository.<init>(AbstractRepository.java:74) at sun.reflect.generics.repository.GenericDeclRepository.<init>(GenericDeclRepository.java:49) at sun.reflect.generics.repository.ConstructorRepository.<init>(ConstructorRepository.java:51) at sun.reflect.generics.repository.MethodRepository.<init>(MethodRepository.java:46) at sun.reflect.generics.repository.MethodRepository.make(MethodRepository.java:59)
最新发布
08-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值