Utilizzo di TDictionary per le tabelle hash in Delphi

Introdotto in Delphi 2009, il Classe TDictionary, definito in Generics. Unità Collezioni, rappresenta una raccolta di tipi di tabella hash generica di coppie chiave-valore.

Tipi generici, introdotto anche in Delphi 2009, consente di definire classi che non definiscono in modo specifico il tipo di membri dei dati.

Un dizionario è, in un certo senso, simile a un array. In un Vettore lavori con una serie (raccolta) di valori indicizzati da un valore intero, che può essere qualsiasi valore del tipo ordinale. Questo indice ha un limite inferiore e uno superiore.

In un dizionario, è possibile memorizzare chiavi e valori in cui entrambi possono essere di qualsiasi tipo.

Il costruttore TDictionary

Da qui la dichiarazione del costruttore TDictionary:

In Delphi, TDictionary è definito come una tabella hash. Le tabelle hash rappresentano una raccolta di coppie chiave-valore organizzate in base al codice hash della chiave. Le tabelle hash sono ottimizzate per le ricerche (velocità). Quando una coppia chiave-valore viene aggiunta a una tabella hash, l'hash della chiave viene calcolata e memorizzata insieme alla coppia aggiunta.

instagram viewer

TKey e TValue, poiché sono generici, possono essere di qualsiasi tipo. Ad esempio, se le informazioni che devi memorizzare nel dizionario provengono da alcuni database, la tua chiave può essere un GUID (o qualche altro valore che presenta l'indice univoco) mentre il valore può essere un oggetto mappato a una riga di dati nel database tabelle.

Utilizzando TDictionary

Per semplicità, l'esempio seguente utilizza numeri interi per TKeys e caratteri per TValues.

Innanzitutto, dichiariamo il nostro dizionario specificando quali saranno i tipi di TKey e TValue:

Quindi il dizionario viene riempito usando il metodo Aggiungi. Poiché un dizionario non può avere due coppie con lo stesso valore Chiave, è possibile utilizzare il metodo ContainsKey per verificare se nel dizionario è già presente una coppia con valori chiave.

Per rimuovere una coppia dal dizionario, utilizzare il metodo Rimuovi. Questo metodo non causerà problemi se una coppia con una chiave specificata non fa parte del dizionario.

Per passare attraverso tutte le coppie eseguendo il ciclo attraverso i tasti puoi fare un per in loop.

Utilizzare il metodo TryGetValue per verificare se nel dizionario è inclusa una coppia chiave-valore.

Ordinamento del dizionario

Poiché un dizionario è una tabella hash, non memorizza gli elementi in un ordinamento definito. Per scorrere le chiavi ordinate per soddisfare le tue esigenze specifiche, sfrutta TList, un tipo di raccolta generico che supporta l'ordinamento.

Il codice sopra ordina le chiavi in ​​ordine crescente e decrescente e prende i valori come se fossero memorizzati nell'ordine ordinato nel dizionario. L'ordinamento discendente dei valori di chiave di tipo intero utilizza TComparer e un metodo anonimo.

Quando chiavi e valori sono di tipo TObject

L'esempio sopra elencato è semplice perché sia ​​la chiave che il valore sono tipi semplici. Puoi avere dizionari complessi in cui sia la chiave che il valore sono tipi "complessi" come record o oggetti.

Ecco un altro esempio:

Qui viene utilizzato un record personalizzato per la chiave e un oggetto / classe personalizzati per il valore.

Nota l'uso di uno specialista TObjectDictionary classe qui. TObjectDictionary può gestire automaticamente la durata degli oggetti.

Il valore chiave non può essere nullo, mentre il valore valore può.

Quando viene istanziato un TObjectDictionary, un parametro Ownerships specifica se il dizionario possiede le chiavi, i valori o entrambi - e quindi aiuta a non avere perdite di memoria.