![]() |
Delphi-Version: 5
TDictionary mit zusammengesetzem Schlüssel
Moin!
Ich möchte ein TDictionary verwenden, um ein Schlüssel/Wert-Paar zu speichern. Nun ist es jedoch so, dass mein Schlüssel aus 2 Werten (2x Int64) besteht. Wie löst man das ab schönsten? Ich könnte ja z.B. ein Record verwenden mit diesen beiden Feldern. Aber ist das wirklich der richtige Weg? Die Liste wird warscheinlich max. 20 Einträge haben, die relativ selten geändert werden. Allerdings wird häufig geprüft werden, ob ein bestimmtes Schlüsselpaar schon in der Liste existiert. Dabei kommt es mir nicht auf das allerletzte Quäntchen Geschwindigkeit an. Lesbarer Code ist mir an der Stelle wichtiger. Vielen Dank! Jens |
AW: TDictionary mit zusammengesetzem Schlüssel
Das Dictionary ableiten oder kapseln.
Da kannst'e dann deine beiden Integer reingeben, es wird in einen Record übertragen und an die interne Liste weitergegeben. Alternativ geht auch ein DatenObject, allerdings brauchst du dann ein eventuell TObjectDictionary, für die einfachere Speicherverwaltung, und du brauchst vorallem einen Comparer, welcher den Inhalt der Objekte vergleichen kann. |
AW: TDictionary mit zusammengesetzem Schlüssel
Zitat:
Wenn es um Geschwindigkeit geht: Bei 20 Einträgen könnte man schon überlegen, ob du die Teile nicht in ein sortiertes Array packst und einfach durchscanst oder eine binäre Suche machst. |
AW: TDictionary mit zusammengesetzem Schlüssel
Das Dictionary ist quasi auch sortiert und zwar nach dem Hash der Schlüssel.
|
AW: TDictionary mit zusammengesetzem Schlüssel
Zitat:
Kapseln! Favour Composition over Inheritance (FCoI) ![]() Und als Key ein einziger Typ: also type TFookey = ... bei dir also dann wohl einen record. |
AW: TDictionary mit zusammengesetzem Schlüssel
Zitat:
Ansonsten gab es neulich erst einen ähnlichen Thread: ![]() |
AW: TDictionary mit zusammengesetzem Schlüssel
Na so
Delphi-Quellcode:
könnte schon ausreichen, als Hash in einem Dictionary. Wenn man den Lookup sehr häufig benötigt, bringt das schon etwas. Aber sonst könnte selbst binary search länger als eine lineare Suche dauern. Hier hängt sehr viel von der konkreten Implementierung ab. Eine For-Schleife über max 20 Einträge könnte echt schneller sein, als eine While-Schleife mit DIV, IF etc.
(A XOR B) mod 23
Ausprobieren. |
AW: TDictionary mit zusammengesetzem Schlüssel
Die offensichtlichste Lösung wäre wohl:
Delphi-Quellcode:
Was wäre daran auszusetzen?
type
TMyKey = record a, b: Int64; end; ... var myDict: TDictionary<TMyKey,irgendwas>; |
AW: TDictionary mit zusammengesetzem Schlüssel
Zitat:
Zitat:
|
AW: TDictionary mit zusammengesetzem Schlüssel
Zitat:
Delphi-Quellcode:
Würde ich jetzt nicht sagen. Hinter der Klasse kann man eben auch den Vorschlag von Stevie implementieren (dann muss man aber noch den equal-Operator implementieren :shock:), oder eine lineare Suche (aufwändiger) oder eine binäre Suche (noch aufwändiger) oder einen Baum (noch viel Aufwändiger) oder eine Skiplist (noch viel viel Aufwändiger) oder ach was weiss ich denn verbergen.
Type
TTwoBigIntList<T> = class fDict : TDictionary<Int64,T>; public constructor Create; property Item[Key1, Key2 : Int64] : T Read GetItem; ... end; ... Function TTwoBigIntList<T>.GetItem(Key1, Key2 : Int64) : T; begin return FDict.Get(Key1 xor Key2); // ist natürlich nicht eindeutig... ;-( end; Wobei: In der Klasse würde ich überhaupt kein Verhalten implementieren, sondern eine vorgefertigte Struktur verwenden, die der Aufgabenstellung angemessen erscheint (lookup, sort, insert etc.) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz