Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TDictionary mit zusammengesetzem Schlüssel (https://www.delphipraxis.net/185534-tdictionary-mit-zusammengesetzem-schluessel.html)

Nersgatt 18. Jun 2015 18:22

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

himitsu 18. Jun 2015 18:45

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.

BUG 18. Jun 2015 18:49

AW: TDictionary mit zusammengesetzem Schlüssel
 
Zitat:

Zitat von Nersgatt (Beitrag 1305602)
Lesbarer Code ist mir an der Stelle wichtiger.

Damit ist es ja quasi eh egal, was du tatsächlich machst, du kannst es dann einfach wegkapseln :stupid:

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.

himitsu 18. Jun 2015 19:11

AW: TDictionary mit zusammengesetzem Schlüssel
 
Das Dictionary ist quasi auch sortiert und zwar nach dem Hash der Schlüssel.

freimatz 19. Jun 2015 16:09

AW: TDictionary mit zusammengesetzem Schlüssel
 
Zitat:

Zitat von himitsu (Beitrag 1305603)
Das Dictionary ableiten oder kapseln.


Kapseln! Favour Composition over Inheritance (FCoI)
http://ccd.ralfw.domainfactory-kunde...heritance_FCoI

Und als Key ein einziger Typ: also type TFookey = ... bei dir also dann wohl einen record.

Namenloser 19. Jun 2015 19:07

AW: TDictionary mit zusammengesetzem Schlüssel
 
Zitat:

Zitat von BUG (Beitrag 1305604)
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.

Bei 20 Einträgen würde ich mir sogar das Sortieren sparen.

Ansonsten gab es neulich erst einen ähnlichen Thread: http://www.delphipraxis.net/185238-s...ys-delphi.html

Dejan Vu 19. Jun 2015 19:23

AW: TDictionary mit zusammengesetzem Schlüssel
 
Na so
Delphi-Quellcode:
(A XOR B) mod 23
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.

Ausprobieren.

Stevie 19. Jun 2015 22:07

AW: TDictionary mit zusammengesetzem Schlüssel
 
Die offensichtlichste Lösung wäre wohl:

Delphi-Quellcode:
type
  TMyKey = record
    a, b: Int64;
  end;

...
var
  myDict: TDictionary<TMyKey,irgendwas>;
Was wäre daran auszusetzen?

Namenloser 20. Jun 2015 06:17

AW: TDictionary mit zusammengesetzem Schlüssel
 
Zitat:

Zitat von Dejan Vu (Beitrag 1305799)
Na so
Delphi-Quellcode:
(A XOR B) mod 23
könnte schon ausreichen, als Hash in einem Dictionary.

Ist aber aufwändiger zu programmieren als eine schnöde Liste mit linearer Suche.

Zitat:

Zitat von Nersgatt (Beitrag 1305602)
Dabei kommt es mir nicht auf das allerletzte Quäntchen Geschwindigkeit an. Lesbarer Code ist mir an der Stelle wichtiger.


Dejan Vu 20. Jun 2015 08:19

AW: TDictionary mit zusammengesetzem Schlüssel
 
Zitat:

Zitat von Namenloser (Beitrag 1305847)
Zitat:

Zitat von Dejan Vu (Beitrag 1305799)
Na so
Delphi-Quellcode:
(A XOR B) mod 23
könnte schon ausreichen, als Hash in einem Dictionary.

Ist aber aufwändiger zu programmieren als eine schnöde Liste mit linearer Suche.

Delphi-Quellcode:
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;
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.

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 03:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz