Usando TDictionary para tabelas de hash no Delphi

Introduzido em Delphi 2009, o Classe TDictionary, definido nos genéricos. Unidade de coleções, representa uma coleção de tipos de tabela de hash genérica de pares de valores-chave.

Tipos genéricos, também introduzido no Delphi 2009, permite definir classes que não definem especificamente o tipo de membros de dados.

Um dicionário é, de certa forma, semelhante a uma matriz. Em um matriz você trabalha com uma série (coleção) de valores indexados por um valor inteiro, que pode ser qualquer valor do tipo ordinal. Este índice tem um limite inferior e um superior.

Em um dicionário, você pode armazenar chaves e valores onde qualquer um pode ser de qualquer tipo.

O construtor TDictionary

Daí a declaração do construtor TDictionary:

No Delphi, o TDictionary é definido como uma tabela de hash. As tabelas de hash representam uma coleção de pares de chave e valor organizados com base no código de hash da chave. As tabelas de hash são otimizadas para pesquisas (velocidade). Quando um par de valores-chave é adicionado a uma tabela de hash, o hash da chave é calculado e armazenado junto com o par adicionado.

instagram viewer

O TKey e o TValue, por serem genéricos, podem ser de qualquer tipo. Por exemplo, se as informações que você deseja armazenar no dicionário vierem de algum banco de dados, sua Chave poderá ser um GUID (ou outro valor que apresenta o índice exclusivo), enquanto o valor pode ser um objeto mapeado para uma linha de dados em seu banco de dados mesas.

Usando TDictionary

Por uma questão de simplicidade, o exemplo abaixo usa números inteiros para TKeys e caracteres para TValues.

Primeiro, declaramos nosso dicionário especificando quais serão os tipos de TKey e TValue:

Em seguida, o dicionário é preenchido usando o método Add. Como um dicionário não pode ter dois pares com o mesmo valor de chave, você pode usar o método ContainsKey para verificar se algum par com valor de chave já está dentro do dicionário.

Para remover um par do dicionário, use o método Remove. Este método não causará problemas se um par com uma chave especificada não fizer parte do dicionário.

Para percorrer todos os pares, percorrendo as teclas, você pode fazer um para em loop.

Use o método TryGetValue para verificar se algum par de valores-chave está incluído no dicionário.

Classificando o dicionário

Como um dicionário é uma tabela de hash, ele não armazena itens em uma ordem de classificação definida. Para percorrer as chaves que são classificadas para atender às suas necessidades específicas, aproveite o TList - um tipo de coleção genérico que suporta a classificação.

O código acima classifica as chaves ascendentes e descendentes e captura os valores como se eles estivessem armazenados na ordem classificada no dicionário. A classificação decrescente dos valores da chave do tipo inteiro usa TComparer e um método anônimo.

Quando chaves e valores são do tipo TObject

O exemplo listado acima é simples porque a chave e o valor são tipos simples. Você pode ter dicionários complexos em que a chave e o valor são tipos "complexos", como registros ou objetos.

Aqui está outro exemplo:

Aqui, um registro personalizado é usado para a Chave e um objeto / classe personalizado é usado para o valor.

Observe o uso de um especialista TObjectDictionary aula aqui. TObjectDictionary pode lidar com a vida útil dos objetos automaticamente.

O valor da chave não pode ser nulo, enquanto o valor do valor pode.

Quando um TObjectDictionary é instanciado, um parâmetro Ownerships especifica se o dicionário possui as chaves, valores ou ambos - e, portanto, ajuda a não ter vazamentos de memória.

instagram story viewer