![]() |
Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
Hallo Leute,
ich bin bei einem Projekt gerade dabei bestimmte Werte (genauer gesagt: Fenstertitel, X-&Y-Koordinaten sowie einen zugehörigen String) in eine Art Array zu packen. Um mal PHP als triviale Analogie herzunehmen:
PHP-Quellcode:
Ich denke das System ist naheliegend.
$hash['Foo'][12][27] = 'Bar';
$hash['Hello'][18][59] = 'World'; Mein Problem: wie stelle ich das am geschicktesten mit Delphi dar? :| Assoziative Arrays im klassischen Sinne gibt es ja nicht. Nehme ich aber ein TDictionary, sieht das am Ende gruselig aus:
Delphi-Quellcode:
Das kann ja nun auch nicht des Rätsels Lösung sein. Hoffe ich. :lol:
var hash: TDictionary<String, TDictionary<Integer, TDictionary<Integer, String>>>;
Nun ist die Frage: wie kann ich am einfachsten oder am elegantesten einem Key über (Fenstertitel, X, Y) den Wert (String) zuordnen? Wenn alles nichts hilft habe ich schon über sowas nachgedacht:
Delphi-Quellcode:
Ist zwar nicht das Eleganteste, aber funktioniert immerhin recht einfach. Schließlich sollen die drei Parameter ja nur einen Key bilden. Alles in einem Array (oder etwas adäquatem) zu speichern, würde zu einem späteren Zeitpunkt die Iteration über die einzelnen Parameter vereinfachen (z.B. einen Dump von nur einem bestimmten Fenster im Hash erstellen). Aber notfalls könnte ich darauf wohl verzichten. Die meisten Zugriffe erfolgen einfach nach dem Schema Key->Value.
hash := TDictionary<String, String>.Create;
hash.Add('Foo_12_27', 'Bar'); Vielen Dank schon mal für eure Ideen und Vorschläge! :) mfg, mh166 |
AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
Ich finde deine erste Idee mit dem Tdictionary aus der RTL gar nicht so schlecht. Einmal einen Typalias dafür generiert und gut ist: Jeder weiß was gemeint ist und Tipparbeit sparst du meinetwegen auch. Analog zum Typalias noch eine Methode welche eine leere Instanz (oder Klon) liefert und man hat doch alles, oder?
Nur weil die Rohform gruselig aussieht? Wie ich in C++ schon manchen habe Templates missbrauchen sehen ist das aber noch richtig gut :) |
AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
Nimm statt
Delphi-Quellcode:
oder
string
Delphi-Quellcode:
einfach einen Record mit einem
integer
Delphi-Quellcode:
für diese beiden Typen.
class operator implicit
PHP behandelt z.B.
Delphi-Quellcode:
und
1
Delphi-Quellcode:
gleich. Der interne Wert ist also immer ein String.
'1'
|
AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
Wow Cooler Threadtitel...
Was willst Du den damit erreichen? Wie viele Fenster sind es denn? 10 100 1000 mehr? Wie schnell musst Du das Richtige finden? Mavarik |
AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
Zitat:
Zitat:
Delphi-Quellcode:
oder
String
Delphi-Quellcode:
, sind da weniger das große Problem. Aber danke für deinen Vorschlag: im Zuge dessen gleich mal wieder was zur Überladung von Operatoren gelernt. 8-)
integer
Zitat:
Zitat:
Insgesamt sind es wohl kaum an die 10 Fenster. Dementsprechend ist auch die Frage nach der Performance nicht wirklich dramatisch. Mir gings mehr um die Frage der "Eleganz" und "Sinnhaftigkeit" bei dieser Konstellation. mfg, mh166 |
AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
Ich habe in Delphi mit Templates keine Erfahrung, aber ich würde das so machen, wenn das geht (eher Pseudocode, da ich wie gesagt die Einzelheiten nicht kenne):
Delphi-Quellcode:
TPair<A, B> = class
private a: A; b: B; public function Hash: THash; end; function TPair.Hash: THash; begin Result := a.Hash xor b.Hash; end;
Delphi-Quellcode:
usw. je nachdem, wie viele Dimensionen man braucht.
TTriple<A, B, C> = class
private a: A; b: B; c: C; public function Hash: THash; end; function TTriple.Hash: THash; begin Result := a.Hash xor b.Hash xor c.Hash; end; Und dann z.B.
Delphi-Quellcode:
verwenden.
TDictionary<TTriple<string, integer, integer>, string>
|
AW: Sinnvollste Abbildung eines mehrdimensionalen assoziativen Arrays in Delphi?
Type
Delphi-Quellcode:
TFormStorage = class
private Function GetItem(const formName : String; X,Y : Integer) : String; Procedure SetItem(const formName : String; X,Y : Integer; const value : String); public property Item[formName : String; X,Y : Integer] : String Read GetItem Write SetItem; end; var formStorage : TFormStorage; ... // Zugriff formStorage['Foo',12,34] := 'Bar'; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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 by Thomas Breitkreuz