AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TDictionary mit zusammengesetzem Schlüssel

TDictionary mit zusammengesetzem Schlüssel

Ein Thema von Nersgatt · begonnen am 18. Jun 2015 · letzter Beitrag vom 22. Jun 2015
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
689 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

TDictionary mit zusammengesetzem Schlüssel

  Alt 18. Jun 2015, 18:22
Delphi-Version: 5
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
Jens
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
35.430 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: TDictionary mit zusammengesetzem Schlüssel

  Alt 18. Jun 2015, 18:45
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: TDictionary mit zusammengesetzem Schlüssel

  Alt 18. Jun 2015, 18:49
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
35.430 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TDictionary mit zusammengesetzem Schlüssel

  Alt 18. Jun 2015, 19:11
Das Dictionary ist quasi auch sortiert und zwar nach dem Hash der Schlüssel.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
713 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: TDictionary mit zusammengesetzem Schlüssel

  Alt 19. Jun 2015, 16:09
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.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: TDictionary mit zusammengesetzem Schlüssel

  Alt 19. Jun 2015, 19:07
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
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: TDictionary mit zusammengesetzem Schlüssel

  Alt 19. Jun 2015, 19:23
Na so (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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.683 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: TDictionary mit zusammengesetzem Schlüssel

  Alt 19. Jun 2015, 22:07
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?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

AW: TDictionary mit zusammengesetzem Schlüssel

  Alt 20. Jun 2015, 06:17
Na so (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.

Dabei kommt es mir nicht auf das allerletzte Quäntchen Geschwindigkeit an. Lesbarer Code ist mir an der Stelle wichtiger.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: TDictionary mit zusammengesetzem Schlüssel

  Alt 20. Jun 2015, 08:19
Na so (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 ), 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.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf