A Delphi 2009-ben mutatták be TD Dictionary osztály, amelyet a Generics határoz meg. Gyűjteményegység: a kulcs-érték párok általános hash table típusú gyűjteménye.
Általános típusok, amelyet a Delphi 2009-ben is bevezetett, lehetővé teszi olyan osztályok meghatározását, amelyek nem konkrétan határozzák meg az adattagok típusát.
A szótár bizonyos értelemben hasonlít egy tömbre. Egy sor egész értékkel indexált értékek sorozatával (gyűjteményével) dolgozik, amely bármilyen lehet rendi típusú érték. Ennek az indexnek van egy alsó és egy felső határa.
A szótárban tárolhat kulcsokat és értékeket, ahol bármelyik lehet bármilyen típusú.
A TD Dictionary kivitelező
Ezért a TD Dictionary konstruktor nyilatkozata:
Delphi-ben a TD Dictionary szétválasztott táblázatként van definiálva. A hasítótáblák a kulcs és az érték párok gyűjteményét képviselik, amelyeket a kulcs kivonatkódja alapján rendeznek el. A hasáb táblák a keresésekre vannak optimalizálva (sebesség). Ha kulcs-érték pár hozzáadódik a hash-táblázathoz, akkor a kulcs hash-ját kiszámítja és tárolja a hozzáadott párral együtt.
A TKey és a TValue, mivel generikusak, bármilyen lehetnek. Például, ha a szótárban tárolni kívánt információ valamilyen adatbázisból származik, akkor a kulcs GUID lehet (vagy valamilyen más érték, amely bemutatja az egyedi index értéket), míg az Érték egy objektum lehet, amely az adatbázis adatsorához van leképezve táblázatokat.
A TD Dictionary használata
Az egyszerűség kedvéért az alábbi példa egész számot használ a TKeys-hez, betűket a TV-értékekhez.
Először deklaráljuk a szótárunkat azzal, hogy meghatározzuk a TKey és a TValue típusait:
Ezután a szótárt az Add metódussal tölti ki. Mivel a szótárban nem lehet két pár azonos kulcsértékkel, a ContainsKey módszerrel ellenőrizheti, hogy van-e valami kulcsértékű pár a szótárban.
Pár eltávolításához a szótárból használja az Eltávolítás módszert. Ez a módszer nem okoz problémát, ha egy megadott kulcsmal rendelkező pár nem része a szótárnak.
Ahhoz, hogy az összes párt átmenjen a kulcsok átcsavarásával, megteheti a a hurokban.
A TryGetValue módszerrel ellenőrizze, hogy szerepel-e valamilyen kulcs-érték pár a szótárban.
A szótár rendezése
Mivel a szótár hash-tábla, nem tárolja az elemeket meghatározott rendezési sorrendben. Az egyedi igények kielégítésére rendezett kulcsok segítségével történő iteráláshoz használja ki a TList - egy általános gyűjteménytípus, amely támogatja a rendezést.
A fenti kód a kulcsokat növekvő és csökkenő sorrendbe rendezi, és értékeket megragad, mintha azokat a szótár rendezett sorrendjében tárolnák. Az egész szám típusú kulcsok csökkenő rendezése a TComparer és egy anonim módszer használatával történik.
Amikor a kulcsok és értékek TObject típusúak
A fent felsorolt példa egyszerű, mivel mind a kulcs, mind az érték egyszerű típusú. Lehet bonyolult szótárak is, ahol a kulcs és az érték egyaránt "összetett" típusú, például rekordok vagy objektumok.
Íme egy másik példa:
Itt egy egyedi rekordot használunk a kulcshoz, és egyéni objektumot / osztályt használunk az értékhez.
Vegye figyelembe a speciális alkalmazást TObjectDictionary osztály itt. A TObjectDictionary automatikusan kezeli az objektumok élettartamát.
A kulcs értéke nem lehet nulla, míg a Érték értéke lehet.
A TObjectD Dictionary szinkronizálásakor az Ownerships paraméter meghatározza, hogy a szótár rendelkezik-e kulcsokkal, értékekkel vagy mindkettővel -, és ezért segít abban, hogy ne maradjon memória.