Hash-Tabellen, oder 'Dictionaries', Wörterbücher etc. sind sehr nützliche Hilfsmittel, für die Delphi leider keine brauchbare Klasse bereitstellt. Zwar erfüllt die TStringList-Klasse mit ihrem String/Objekt Tupel die Grundvoraussetzungen, aber schnell ist das nicht.
Also, bastelt man sich eben eine Klasse. Hier sind es Zwei. Sie unterscheiden sich im Datentyp für den Schlüssel.
TStringDictionary implementiert eine Dictionary mit einem String als Schlüssel (und einem Pointer als zu speicherndem Datum).
TIntegerDictionary macht das Gleiche, aber mit einem Int64 als Schlüssel.
Das schöne an den Klassen ist, das sie sich automatisch vergrößern, wenn die Liste zu mehr als ca. 65% gefüllt ist.
Add (Key, Data) fügt ein Element in das Dictionary ein, das mit
Find(Key, Data) wieder gefunden werden kann. Mit
Delete (Key) löscht man den Eintrag, wenn man nur die Daten hat, tut es
DeleteData (Data) auch, wobei das natürlich länger dauert.
Die Klasse unterstützt das Durchiterieren (allerdings unsortiert). Mit
First springt man zum ersten Datensatz, über die Funktion
Next (Key, Data) bekommt man den jeweils nächsten Eintrag, bis die Funktion
False liefert.
TotalCount liefert die Anzahl der Einträge.
Abschließend sei noch bemerkt, das in der Klasse TStringDictionary aus dem String-Schlüssel die 16-Bit CRC als Hashwert gebildet wird, die
Unit csCRC wird mitgeliefert. Das ist bestimmt nicht optimal, aber mir hat es gereicht. Wer hier bessere Verfahren kennt, kann die natürlich verwenden.
Update:
Was ist neu?
- Die CRC32-Hashfunktion wurde durch die wesentlich schnellere ELF-Hash Funktion ersetzt.
- Neue Methode 'Contains'
- Neue Eigenschaft 'CaseInsensitive'
- Code ansatzweise kommentiert
[edit=Chakotay1308] Mfg, Chakotay1308[/edit]
[edit=Matze]Update hinzugefügt (7.11.06). Mfg, Matze[/edit]
[edit=Matze]Neues Update hinzugefügt (7.6.07). Mfg, Matze[/edit]