Delphi | Pgina
sobre a Linguagem |
Usando a classe TDictionaryComo 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, 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 |
- Todos os artigos - |