Informações pessoais Informações Pessoais
Ciência e Tecnologia Ciência e Tecnologia
Embarcadero Delphi Delphi
Para Sua Área Profissional Área Profissional

 

Delphi Delphi

Pgina sobre a Linguagem
de programao da Embarcadero

Usando a classe TDictionary

Como utilizar TDictionary para armazenar pares de chave-valor

26-03-2015

O Delphi possui uma classe de objetos muito til chamada TDictionary. Ela foi introduzida na verso 2009 e est definida na unit Generics.Collections. O objetivo representar conjuntos de chaves (" keys") e valores. semelhante a um array (uma matriz, um vetor) ou ainda a uma TValueList, com a diferena de que voc no precisa usar sempre um tipo de dado especifico para seus membros - diferentemente, por exemplo, de um array onde, obrigatoriamente, a "chave" (o ndice do array) deve ser numrico e os valores podem ser de qualquer tipo previamente definido.

 

TDictionary uma estrutura de dados definida como uma matriz associativa, conhecida como "hash table" (ou "hash map"). Isso significa que os dados so organizados com base em um "cdigo" hash da chave. Quando um novo par chave-valor adicionado a TDictionary, um hash criado e adicionado junto ao par. Isso torna a estrutura otimizada para buscas, reduzindo o tempo de resposta.

 

O mtodo construtor de TDictionary dado por:

 

TDictionary<TKey, TValue>.Create;

 

onde valores de TKey e TValue podem ser de qualquer tipo.

 

Como usar o TDictionary

 

Por questes de simplicidade, o exemplo a seguir utiliza Integer para TKey e Char para TValue:

 

(...)

var

D: TDictionary<integer, char>;

SortKeys : TList<integer>;

i, ran: integer;

c : char;

begin

Memo1.Lines.Clear;

Memo1.Lines.Text := 'Usando TDictionary';

 

Randomize;

 

D:= TDictionary<integer, char>.Create;

try

// Adiciona alguns pares de chave/valor;

//os inteiros so gerados aleatoriamente e armazenados como valores ASCII em TValue, comeando a partir da letra "A" (ASCII 65)

for i := 1 to 20 do

begin

ran := Random(30);

 

if NOT D.ContainsKey(ran) then D.Add(ran, Char(65 + ran));

end;

(...)

 

//Remove pares

for i := 1 to 20 do

begin

ran:= Random(30);

D.Remove(ran);

end;

 

(...)

 

 

//Lista os elementos buscando pela chave

Memo1.Lines.Add('Elementos: ');

for i in D.Keys do

Memo1.Lines.Add(Format('%d, %s', [i, D.Items[i]]));

 

//Procura especificamente a existncia da chave 80 e,
//se encontrar, exibe seu valor na varivel "c"

if D.TryGetValue(80, c) then

Memo1.Lines.Add(Format('Encontrado: , valor: %s', [c]))

else

Memo1.Lines.Add( 'Valor no encontrado');

 

 

//Ordena de modo crescente as chaves usando uma lista

SortKeys := TList.Create(D.Keys);

try

SortKeys.Sort; { o padro do mtodo Sort() crescente }

for i in SortKeys do

Memo1.Lines.Add(Format('%d, %s', [i, D.Items[i]]));

finally

SortKeys.Free;

end;

 

finally

D.Free;

end;

end;

 

Observe os mtodos usados acima. Para localizar uma determinada chave, usamos ContainsKey(); para remover um determinado par, usamos Remove(); para sabermos de um par chave-valor j existe em TDictionary, usamos TryGetValue().

 

Para ordenar valores, no conseguimos fazer isso na prpria classe TDictionary, por isso foi usado uma coleo da classe Generics TList. TList possui o mtodo Sort() para isso.

Fonte: delphi.about.com


Usando Virtual-Key Codes - 27-03-2015

Sua Primeira Aplicao FireMonkey - 22-03-2015

Efeitos de imagem no Delphi - 22-03-2015

Timer: criando um cronmetro - 10-09-2013

Criando um Tocador de udio com Playlist - 03-09-2013

Criando um Navegador Web com TWebBrowser - 03-09-2013

Personalizando o DBNavigator - 01-09-2013

Como Esmaecer um Formulrio - 24-09-2010

Procure um assunto especfico:  

 

  - Todos os artigos -